终结操作和中间操作的区别:中间操作返回的一直都是stream,所以可以一直使用,但是终结操作返回的不是stream,后面不能继续操作
foreach:对流中的所有元素进行遍历操作
count:获取当前流内元素的个数//这个是无参的
max&min:这个也是需要比较器的,具体写法和sort差不多,但是返回值是Optional
collect(Collectors.toList()):把当前的流转换成集合
collect(Collectors.toMap(a->a.getKey,a->a.getValue)) //转换成map
查找和匹配:1.anyMatch | allMatch | noneMatch,返回类型是boolean,只要有符合的就会返回true,需要一个判断条件函数做参
2.findAny | findFirst 无参数传入,获取流中的一个元素,any没法保证获取的一定是流中的第一个元素(有随机性)
reduce归并:对流中的数据按照指定的计算方式计算出结果(缩减操作)
reduce(初始值,(结果,遍历元素)->(对结果与遍历元素进行操作))
两个元素
使用提供的标识值和关联累积函数对此流的元素执行缩减,并返回缩减值。这相当于: int result = identity; for (int element : this stream) result = accumulator.applyAsInt(result, element) return result; 但不受顺序执行的约束。 该 identity 值必须是累加器函数的标识。这意味着对于所有人来说 x, accumulator.apply(identity, x) 都是平等 x的。该 accumulator 函数必须是 关联 函数。 这是一个 终端操作。 参数: identity – 累加函数的恒等值 op– 用于组合两个值的关联、非干扰、无状态函数 返回: 减少的结果
一个元素(通过文档可知,这里就是把要遍历的第一个元素设置为结果)
使用关联累积函数对此流的元素执行缩减,并返回OptionalInt描述缩减值(如果有)。这相当于: boolean foundAny = false;
int result = null;
for (int element : this stream) {
if (!foundAny) {
foundAny = true;
result = element;
}
else
result = accumulator.applyAsInt(result, element);
}
return foundAny ? OptionalInt.of(result) : OptionalInt.empty(); 但不受顺序执行的约束。 该 accumulator 函数必须是 关联 函数。 这是一个 终端操作。 参数: op– 用于组合两个值的关联、非干扰、无状态函数 返回: 减少的结果
stream总结:
1.惰性求值(如果只有中间操作没有终结操作所有操作都不会进行)
2.流是一次性的(流使用完之后就会报废,不可以重复使用)
3.不会影响原数据(正常情况下stream操作不会对原数据产生修改)
写一下学习中遇到的一些有趣的问题
int[] arr = {1, 2, 3, 4, 5, 6}; int reduce = Arrays.stream(arr).reduce(0, (int1, int2) -> int1<int2?int1:int2); int reduce1 = Arrays.stream(arr).reduce(0, (int1, int2) -> Math.min(int1, int2)); int reduce2 = Arrays.stream(arr).reduce(0, Math::min)
我根据idea的提示从0->1->2一步一步简写判断语句
Intger类有里就有最值
int minValue = Integer.MIN_VALUE; int maxValue = Integer.MAX_VALUE;
标签:函数,stream,int,终结,元素,写写,result,操作 From: https://www.cnblogs.com/kun1790051360/p/17926693.html