非短路终端操作
非短路终端操作,就是所有的元素都遍厉完,直到最后才结束。用来收集成自己想要的数据。
方法有:
遍厉 forEach
//遍厉 forEach
@Test
public void forEachTest() {
list.stream()
.forEach(iter ->
//以json格式输出
System.out.println(
JSON.toJSONString(iter, true)));
}
//在最后的时候输出所有的sku里面的值,不做别的操作
归约 reduce
//归约 reduce
@Test
public void reduceTest() {
//reduce可以对流里面的数值进行,求和,最大值,最小值,拼接。。
//你可以在reduce里面做任何自己想做的操作。
//下面的min,max,都是reduce的简化。
Optional<Double> reduceSum = list.stream()
.map(Sku::getSkuPrice)
.reduce(Double::sum);
System.out.println(reduceSum.get());
//11326.5
Double reduceSumTest = list.stream()
.map(Sku::getSkuPrice)
.reduce(100.00, Double::sum);
System.out.println(reduceSumTest);
//11426.5
Integer reduce = Stream.of(1, 2, 3).
reduce(4,
(integer, integer2) -> integer + integer2,
(integer, integer2) -> integer + integer2);
System.out.println(reduce);
//非并行的结果:10
//并行的结果:18,在of后面加上:parallel()
}
有一篇文章对这个问题分析的特别的好: >>
最大值 max
//最大值 max
@Test
public void maxTest() {
Optional<Double> max = list.stream()
.map(Sku::getSkuPrice)
.max(Double::compareTo);
//如果的别的类型的话,也可以用别的类型里面的compareTo操作
System.out.println(max.get());
//4999.0
}
最小值 min
@Test
public void minTest() {
Optional<Double> min = list.stream()
.map(Sku::getSkuPrice)
.min(Double::compareTo);
//如果的别的类型的话,也可以用别的类型里面的compareTo操作
System.out.println(min.get());
//78.2
}
聚合 collect
//聚合 collect
@Test
public void collectTest() {
Stream<String> s1 = Stream.of("aa", "ab", "c", "ad");
//定义一个谓词
Predicate<String> predicate = t -> t.contains("a");
//通过自定义规则收集自己想要的数据
ArrayList<String> collect = s1.parallel().collect(() -> new ArrayList<String>(),
(array, s) -> {
if (predicate.test(s))
array.add(s);
},
(array1, array2) -> array1.addAll(array2));
collect.forEach(System.out::println);
/**
* aa
* ab
* ad
*/
//也可以用定义好的规则,比如:toList,toSet,toMap...
}
有一篇文章对这个问题分析的特别的好: >>
计数 count
//计数 count
@Test
public void countTest() {
long count = list.stream().count();
System.out.println(count);
}
细节决定成败!
个人愚见,如有不对,恳请扶正!