Java8 新特性 Stream 非短路终端操作

非短路终端操作

Java8 新特性 Stream 练习实例

非短路终端操作,就是所有的元素都遍厉完,直到最后才结束。用来收集成自己想要的数据。
方法有:

遍厉 forEach
归约 reduce
最大值 max
最小值 min
聚合 collect
计数 count

遍厉 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);
}


关注公众号,随时获取最新资讯

细节决定成败!
个人愚见,如有不对,恳请斧正!

posted @ 2019-12-08 23:28  一点浩然气~  阅读(635)  评论(0编辑  收藏  举报