java reduce的用法_使用reduce

java reduce的用法_使用reducemap 和 filter 都是 Stream 的转换方法 而 Stream reduce 则是 Stream 的一个聚合方法 它可以把一个 Stream 的所有元素按照聚合函数聚合成一个结果 我们来看一个简单的聚合方法 importjava util stream publicclassM publicstatic String args intsu

map()和filter()都是Stream的转换方法,而Stream.reduce()则是Stream的一个聚合方法,它可以把一个Stream的所有元素按照聚合函数聚合成一个结果。

我们来看一个简单的聚合方法:

import java.util.stream.*;

—-

public class Main {

public static void main(String[] args) {

int sum = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9).reduce(0, (acc, n) -> acc + n);

System.out.println(sum); // 45

}

}

reduce()方法传入的对象是BinaryOperator接口,它定义了一个apply()方法,负责把上次累加的结果和本次的元素

进行运算,并返回累加的结果:

@FunctionalInterface

public interface BinaryOperator {

// Bi操作:两个输入,一个输出

T apply(T t, T u);

}

上述代码看上去不好理解,但我们用for循环改写一下,就容易理解了:

Stream stream = …

int sum = 0;

for (n : stream) {

sum = (sum, n) -> sum + n;

}

可见,reduce()操作首先初始化结果为指定值(这里是0),紧接着,reduce()对每个元素依次调用(acc, n) -> acc + n,其中,acc是上次计算的结果:

// 计算过程:

acc = 0 // 初始化为指定值

acc = acc + n = 0 + 1 = 1 // n = 1

acc = acc + n = 1 + 2 = 3 // n = 2

acc = acc + n = 3 + 3 = 6 // n = 3

acc = acc + n = 6 + 4 = 10 // n = 4

acc = acc + n = 10 + 5 = 15 // n = 5

acc = acc + n = 15 + 6 = 21 // n = 6

acc = acc + n = 21 + 7 = 28 // n = 7

acc = acc + n = 28 + 8 = 36 // n = 8

acc = acc + n = 36 + 9 = 45 // n = 9

因此,实际上这个reduce()操作是一个求和。

如果去掉初始值,我们会得到一个Optional:

Optional opt = stream.reduce((acc, n) -> acc + n);

if (opt.isPresent()) {

System.out.println(opt.get());

}

这是因为Stream的元素有可能是0个,这样就没法调用reduce()的聚合函数了,因此返回Optional对象,需要进一步判断结果是否存在。

利用reduce(),我们可以把求和改成求积,代码也十分简单:

import java.util.stream.*;

—-

public class Main {

public static void main(String[] args) {

int s = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9).reduce(1, (acc, n) -> acc * n);

System.out.println(s); //

}

}

注意:计算求积时,初始值必须设置为1。

除了可以对数值进行累积计算外,灵活运用reduce()也可以对Java对象进行操作。下面的代码演示了如何将配置文件的每一行配置通过map()和reduce()操作聚合成一个Map:

import java.util.*;

—-

public class Main {

public static void main(String[] args) {

// 按行读取配置文件:

List props = List.of(“profile=native”, “debug=true”, “logging=warn”, “interval=500”);

Map map = props.stream()

// 把k=v转换为Map[k]=v:

.map(kv -> {

String[] ss = kv.split(“\\=”, 2);

return Map.of(ss[0], ss[1]);

})

// 把所有Map聚合到一个Map:

.reduce(new HashMap(), (m, kv) -> {

m.putAll(kv);

return m;

});

// 打印结果:

map.forEach((k, v) -> {

System.out.println(k + ” = ” + v);

});

}

}

小结

reduce()方法将一个Stream的每个元素依次作用于BinaryOperator,并将结果合并。

reduce()是聚合方法,聚合方法会立刻对Stream进行计算。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/212732.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午7:23
下一篇 2026年3月18日 下午7:24


相关推荐

  • 紫橙绿蓝的jQuery幻灯片切换

    效果展示 http://hovertree.com/texiao/jquery/77/看惯了左右切换的幻灯片,何问起向您推荐一个新颖的,旋转切换,通过点击按钮的相应区域可以使幻灯片以旋转的方

    2021年12月27日
    44
  • [ACM] POJ 1442 Black Box (堆,优先队列)

    [ACM] POJ 1442 Black Box (堆,优先队列)

    2022年1月31日
    39
  • 除夕官宣!千问3.5开源上线,性能跃升推理效率最高提升19倍

    除夕官宣!千问3.5开源上线,性能跃升推理效率最高提升19倍

    2026年3月13日
    3
  • 实验室设备管理系统C语言——课程设计实习「建议收藏」

    实验室设备管理系统C语言——课程设计实习「建议收藏」本题目将建立一个实验室设备管理系统,记录实验室所有的实验设备,并及时反响设备的运转状况,使用情况,设备购进以后及时记录设备相关信息,对彻底损坏的设备进行报废,维修的设备信息及有更改信息的设备进行统计,解决人工管理系统没解决的问题以及实现对用户更方便的功能,对由严重问题故障的要及时修理,并记录修理日期、设备名、编号、修理厂家、修理费用、责任人等新设备购入后要立即进行设备登记,包括类别、设备名、编号、型号、规格、单价、数量、购置日期、生产厂家保质期和经办人等信息。随时对现有设备及其修理、报废情况进行统计。

    2022年10月13日
    5
  • python画图命令

    python画图命令画两张图importmatplotlib.pyplotaspltplt.rcParams[‘font.sans-serif’]=[‘SimHei’]#用来正常显示中文标签plt.rcParams[‘axes.unicode_minus’]=False#用来正常显示负号plt.figure(1)plt.plot(x_data,y_data,color="red",linewidth…

    2022年5月11日
    42
  • SGD(随机梯度下降)详解

    SGD(随机梯度下降)详解BGDvsSGDBGDv 名词解释功能快捷键合理的创建标题 有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中 居左 居右 SmartyPants 创建一个自定义列表如何创建一个注脚注释也是必不可少的 KaTeX 数学公式新的甘特图功能 丰富你的文章 UML 图表 FLowchart 流程图导出与导入导出导入 BGDvsSGD

    2026年3月16日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号