欢迎您的访问
专注于Java技术系列文章的Java技术分享网站
关注我们

—— 加入社群 ——
「十大城市」工作内推
「微信/QQ」技术讨论
「面试真题」随时领取
公众号名称:搜云库技术团队  公众号ID:souyunku
关注公众号后发送 口令 获取关闭弹窗地址
公众号每天中午 12:20 为你推送一篇技术文章

Java8中新增的Stream API

号外:限时领取:2020,全网最新、最全的技术知识体系

测试数据:

private static List<String> getList() {
    List<String> list = new ArrayList<>();
    list.add("a1");
    list.add("a2");
    list.add("a3");
    list.add("a4");
    list.add("b1");
    list.add("b2");
    list.add("b3");
    list.add("b4");
    return list;
}

private static List<String> getList2() {
        List<String> list = new ArrayList<>();
        list.add("1");
        list.add("2");
        list.add("3");
        list.add("4");
        return list;
}

1、迭代:

List<String> list = getList();
//Java8之前的迭代
for (String s : list) {
    System.out.println(s);
}

//Stream API的迭代
list.forEach(System.out::println);

2、过滤某些元素:

#

//过滤掉不以a开头的字符串
        List<String> list = getList();
        for (Iterator<String> i = list.iterator();i.hasNext();) {
            String s = i.next();
            if(!s.startsWith("a"))
                i.remove();
        }
        System.out.println(list);

        //Stream API
        List<String> list2 = getList();
        list2 = list.stream().filter(s -> s.startsWith("a")).collect(Collectors.toList());
        System.out.println(list2);

3、转换:

//String 转换成 Integer
        List<String> list = getList2();
        List<Integer> list2 = new ArrayList<>();
        for (String s : list) {
            list2.add(Integer.valueOf(s));
        }
        System.out.println(list2);

        //Stream API
        List<String> list3 = getList2();
        List<Integer> list4 = list3.stream().map(Integer :: valueOf).collect(Collectors.toList());
        System.out.println(list4);

4、几个简单的聚合方法:

//聚合方法
        List<String> list = getList();
        List<String> list2 = getList2();
        //最大值
        Optional<String> max = list2.stream().max(String :: compareTo);
        System.out.println(max.get());
        //最小值
        Optional<String> min = list2.stream().min(String :: compareTo);
        System.out.println(min.get());
        //找到第一个以a开头的元素
        Optional<String> first = list.stream().filter(s -> s.startsWith("a")).findFirst();
        System.out.println(first.get());
        //查找一个以a开头的元素(不是按顺序查找),parallelStream是并行执行计算的流
        Optional<String> findAny = list.parallelStream().filter(s -> s.startsWith("a")).findAny();
        System.out.println(findAny.get());
        //查找是否存在以a开头的元素
        boolean anyMatch = list.parallelStream().anyMatch(s -> s.startsWith("a"));
        System.out.println(anyMatch);
        //是否每个元素都是以a开头
        boolean allMatch = list.parallelStream().allMatch(s -> s.startsWith("a"));
        System.out.println(allMatch);
        //是否每个元素都不是以c开头
        boolean noneMatch = list.parallelStream().noneMatch(s -> s.startsWith("c"));
        System.out.println(noneMatch);

上面大部分操作都返回一个Optional类,下面介绍

5、Optional的基本用法:

//Optional的基本用法
        List<String> list = getList();
        Optional<String> findAny = list.parallelStream().filter(s -> s.startsWith("a")).findAny();
        //1、显示判断,如果存在符合条件的元素,则取出来打印(个人不常用)
        if(findAny.isPresent()){
            System.out.println(findAny.get());
        }
        //2、如果存在符合条件的元素,则取出来打印,如果不存在,则什么都不做
        findAny.ifPresent(System.out::println);

        Optional<String> findAny2 = list.parallelStream().filter(s -> s.startsWith("c")).findAny();
        //3、如果不存在符合条件的元素,则用""代替
        System.out.println(findAny2.orElse(""));
        //4、如果不存在符合条件的元素,则用计算的结果代替
        String orElseGet = findAny2.orElseGet(() ->{
            if(System.currentTimeMillis() % 2 == 0)
                return "a99";
            return "";
        });
        System.out.println(orElseGet);
        //5、如果不存在符合条件的元素,则抛出异常
        findAny2.orElseThrow(RuntimeException :: new);

6、收集:

#

//收集,把结果收集组合成MAP
        List<String> list = getList();
        Map<String, Integer> collect = list.stream().collect(Collectors.toMap(s -> s, s -> s.length()));
        System.out.println(collect);

7、并行流parallel的注意事项:

需要确保传递给并行流操作的函数都是线程安全的,

例如,这样做会有问题:

List<String> list = getList();
        List<String> list2 = new ArrayList<>();
        list.parallelStream().forEach(s -> {
            //一定的转换后封装到另一个list
            list2.add(s+"ff");
        }); 
        System.out.println(list.size());
        System.out.println(list2.size());

可以改成这样:

List<String> list = getList();
        List<String> list2 = Collections.synchronizedList(new ArrayList<>());
        list.parallelStream().forEach(s -> {
            //一定的转换后封装到另一个list
            list2.add(s+"ff");
        }); 
        System.out.println(list.size());
        System.out.println(list2.size());

文章永久链接:https://tech.souyunku.com/?p=13151

赞(87) 打赏

版权归原创作者所有,任何形式转载请联系作者;搜云库技术团队 » Java8中新增的Stream API
本站:免责声明!

评论 抢沙发

一个专注于Java技术系列文章的技术分享网站

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏