JDK8 stream API,并行API的适用场合

jdk8stream创建/中间操作/终止操作api

    public static void main(String[] args) {
        //流的创建:可以通过Array/List/Set的stream(),或Stream类的静态方法builder/generate/of等方法
        Lists.newArrayList(1,2,3).stream().forEach(System.out::println);
        System.out.println(Stream.builder().add(1).add(2).add(3).build().collect(Collectors.toList()));
        System.out.println(Stream.iterate(1, i -> ++i).limit(3).collect(Collectors.toList()));//无限流,seed种子,必须limit否则0
        Stream.generate(() -> Math.random()).limit(3).forEachOrdered(System.out::println);//::是对拉姆达的进一步简化
       //流的中间操作:包括filter/distinct/sorted/unordered/skip/limit/peek/map/flatmap等,返回仍是流(必须有终止操作否则中间步骤不执行,parallelStream多核CPU并行操作流排序无效)
        System.out.println(Lists.newArrayList(1, 3, 3, 2, 4, 5, 8, 7, 6).stream().filter(i -> {System.out.println(i);return  i != 1;}).distinct().sorted((o1, o2) -> o1 - o2).skip(1).limit(3).map(o -> ++o).collect(Collectors.toList()));
        System.out.println(Arrays.asList("aa", "bb", "cc", "dd").stream().peek(s -> System.out.println(s)).collect(Collectors.toList()));//peek用于debug,类似map,但无返回
        Stream.of("a,a", "b,b", "c,c", "d,d").flatMap(s ->Stream.of(s.split(","))).forEach(ss -> System.out.println(ss));//flat返回的是流,这些流合并为一个整体流
        Stream.of("a,a", "b,b", "c,c", "d,d,d").map(s ->s.split(",")).forEach(arr -> {System.out.println(arr.length); });//map返回的是基本数据类型
       //流的终止:如非collect/toArray/count/forEach/allMatch/anyMatch/nonMatch/findAny/findFirst/max/min/reduce
        System.out.println(Stream.of("aa", "bb", "cc", "dd").allMatch(Objects::nonNull));
        System.out.println(Stream.of("aa", "bb", "cc", null).anyMatch(s -> StringUtils.isBlank(s)));
        System.out.println(Stream.of("aa", "bb", "cc", null).findFirst().get());
        System.out.println(Stream.of("aa", "bb", "cc", null).map(s -> {System.out.println(s);return s;}).reduce((str1, str2) -> str1 + str2).get());//聚合操作,类似递归,如(((e1+e2)+e3)+e4)
        System.out.println(Stream.of("aa", "bb", "cc", null).map(s ->s+=s).reduce("initVal",(str1, str2) -> str1 + str2));//指定初始值
        //流的终止:特别的统计API
        List<Goods> goods = Lists.newArrayList(
                new Goods("商品1", 1, 1),
                new Goods("商品2", 2, 2),
                new Goods("商品3", 3, 3));
        Double totalPrice = goods.stream().map(item -> item.getPrice() * item.getNum()).reduce((p1, p2) -> p1 + p2).get();
        System.out.println(totalPrice);//14元
        DoubleSummaryStatistics statistics = goods.stream().mapToDouble(item -> item.getPrice() * item.getNum()).summaryStatistics();
        System.out.println("商品种数:"+statistics.getCount());
        System.out.println("最高花费:"+statistics.getMax());
        System.out.println("平均花费:"+statistics.getAverage());
        System.out.println("总花费:"+statistics.getSum());//14元

    }

并行stream API的适用场景测试

public class Test {
    public static void main(String[] args) throws Exception {
        //准备一个数据源集合,测试将集合元素拼接一个字符放入另一个集合
        ArrayList<String> resourceList = new ArrayList<>();
        for (int i = 0; i < 10; i++) {
            resourceList.add(i + "");
        }

        //普通处理。。。。。。。。。。。。。。。。。。。。。。。。。。。
        long t1 = System.currentTimeMillis();
        ArrayList<String> s1 = new ArrayList<>();
        for (String s : resourceList) {
            Thread.sleep(500);//模拟此处有0.5s的其它操作
            s1.add(s + "普通测试");
        }
        long t2 = System.currentTimeMillis();

        //JKD8 parallelStream处理。。。。。。。。。。。。。。。。。。。
        long t3 = System.currentTimeMillis();
        List<String> s2 = resourceList.parallelStream().map(e -> {
            try {
                Thread.sleep(500);//模拟此处有0.5s的其它操作
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
            return e + "Stream测试";
        }).collect(Collectors.toList());
        long t4 = System.currentTimeMillis();

        System.out.println(t2 - t1);
        System.out.println(t4 - t3);
        //结论:1.多次测量输出:5000:1500;
        //     2.当业务的集合迭代处理过程中有较耗时操作时,利用多核CPU及JDK8 并行api,能明显提升效率;
        //     3.简单集合迭代,无耗时操作不推荐stream

    }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值