专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

Java8中新增的Stream API

测试数据:

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/13151

未经允许不得转载:搜云库技术团队 » Java8中新增的Stream API

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们