Java流式编程的使用

流式编程的使用步骤

使用流式编程的步骤就是: 设置数据源, 设置数据处理的方式,设置收集结果的方式。

使用filter方法实现过滤条件

例子为下(查询年龄大于18的用户):

java 复制代码
    @Test
    public void streamTest1() {
        List<Student> students = Arrays.asList(
                new Student("tolen", 22, "男"),
                new Student("ostkakaw", 19, "女"),
                new Student("tolenaitolen", 18, "男")
        );

        List<Student> result = students
                .stream() //stream方法就是设置数据源
                .filter(user -> user.getAge() > 18) //设置过滤条件,这里的过滤条件使用lambda表达式
                .collect(Collectors.toList());//将结果设置为一个list
        for (Student student : result) {
            System.out.println(student.toString());
        }
    }

结果为下:

特殊情况

  1. 限制条件存在多个且需要同时成立(且)

编写格式为下:

java 复制代码
    @Test
    public void streamTest3() {
        List<Student> students = Arrays.asList(
                new Student("tolen", 22, "男"),
                new Student("ostkakaw", 19, "女"),
                new Student("tolenaitolen", 18, "男")
        );
        //编写限制条件
        Predicate<Student> predicate1 = user -> user.getAge() == 18;
        Predicate<Student> predicate2 = user -> user.getName() == "tolenaitolen";


        List<Student> result = students
                .stream() //stream方法就是设置数据源
                .filter(predicate1.and(predicate2)) //如果存在多个需要同时成立的条件时,需要使用and()方法
                .collect(Collectors.toList());//将结果设置为一个list
        for (Student student : result) {
            System.out.println(student.toString());
        }
    }

结果为下:

  1. 限制条件存在多个且不需要同时成立(或)

编写格式为下:

java 复制代码
    @Test
    public void streamTest4() {
        List<Student> students = Arrays.asList(
                new Student("tolen", 22, "男"),
                new Student("ostkakaw", 19, "女"),
                new Student("tolenaitolen", 18, "男")
        );
        //编写限制条件
        Predicate<Student> predicate1 = user -> user.getAge() > 18;
        Predicate<Student> predicate2 = user -> user.getName() == "tolen";

        List<Student> result = students
                .stream() //stream方法就是设置数据源
                .filter(predicate1.or(predicate2)) //如果存在多个需要同时成立的条件时,需要使用and()方法
                .collect(Collectors.toList());//将结果设置为一个list
        for (Student student : result) {
            System.out.println(student.toString());
        }
    }

结果为下:

使用limit方法限制list的长度

例子为下:

java 复制代码
    @Test
    public void streamTest2() {
        List<Student> students = Arrays.asList(
                new Student("tolen", 22, "男"),
                new Student("ostkakaw", 19, "女"),
                new Student("tolenaitolen", 18, "男")
        );
        students
                .stream()//设置数据源
                .limit(2)//设置最大的长度
                .collect(Collectors.toList()) //将结果设置为一个list
                .forEach(student -> System.out.println(student.toString()));
    }

结果为下:

使用min和max方法找出最值

例子为下:

java 复制代码
    @Test
    public void streamTest5() {
        List<Integer> nums = Arrays.asList(4, 5, 1, 3, 6);
        Integer maxResult = nums.stream()//设置数据源
                .max(Integer::compareTo) //这里的lambda表达式使用Integer默认的比较方法,如果需要查询最小值就使用min方法
                .get();//max方法返回的数据是Optional,所以需要使用get方法才获得最终的数据
        System.out.println(maxResult);
    }

结果为下:

如果需要查询最小值的话,我们只需要将max方法换成min方法即可。

使用sorted方法对list进行排序

例子为下:

java 复制代码
    @Test
    public void streamTest6() {
        List<Integer> nums = Arrays.asList(4, 5, 1, 3, 6);
        nums.stream() //设置数据源
                .sorted(Integer::compareTo) //进行排序操作,默认使用升序
                .collect(Collectors.toList()).forEach(num -> System.out.println(num));
    }

结果为下:

特殊情况

需要实现降序,对应的代格式为下:

java 复制代码
    @Test
    public void streamTest6() {
        List<Integer> nums = Arrays.asList(4, 5, 1, 3, 6);
        nums.stream() //设置数据源
                .sorted(Comparator.reverseOrder()) //进行排序操作,默认使用升序,lambda表达式设置为降序
                .collect(Collectors.toList()).forEach(num -> System.out.println(num));
    }

结果为下:

使用map方法和reduce方法对应list的数据进行修改

map方法(返回的结果是多个,而非只有一个,用于返回一个完整的list)

例子为下:

java 复制代码
    @Test
    public void streamTest7() {
        List<Integer> nums = Arrays.asList(4, 5, 1, 3, 6);
        nums.stream() //设置数据源
                .map(num -> num + 10)
                .collect(Collectors.toList())
                .forEach(num -> System.out.println(num));
    }

效果为下:

reduce方法(返回的结果只有一个,用于做累计操作)

例子为下:

java 复制代码
    @Test
    public void streamTest8() {
        List<Integer> nums = Arrays.asList(4, 5, 1, 3, 6);
        Integer result = nums.stream() //设置数据源
                .reduce((num, sum) -> num + sum) //等于做累加操作,在lambda表达式中的参数 num 和sum 的位置可以互换,不影响累加的结果
                .get();
        System.out.println(result);
    }

结果为下:

等于做累加操作,在lambda表达式中的参数 num 和sum 的位置可以互换,不影响累加的结果。

使用count方法计算list的长度

例子为下:

java 复制代码
    @Test
    public void streamTest9() {
        List<Integer> nums = Arrays.asList(4, 5, 1, 3, 6);
        long count = nums.stream() //设置数据源
                .count();
        System.out.println(count);
    }

效果为下:

使用flatMap方法对数据进行压扁

例子:

例子中通过map会获得对应的数组,通过flatMap方法将这些数组压扁为流。(便于后续操作)

作用:将数组转换为流。

相关推荐
菜鸟小杰子几秒前
手动修改 Spring Boot 嵌套 JAR 包:大包小包隔离打包实战
java·jar
Escalating_xu1 分钟前
【C语言项目实战】贪吃蛇(下):移动、碰撞与计分,完成一局可玩的游戏
c语言·开发语言·游戏
计算机编程-吉哥8 分钟前
计算机毕业设计 基于 SpringBoot + Vue 的剧本杀系统 Java毕业设计【任务书、开题报告、中期报告、论文、源码】
java·vue.js·spring boot·毕业设计·课程设计·计算机毕业设计选题
code2cat17 分钟前
【随笔】RAG语义缓存:问题很相似,答案就能直接复用吗
java·缓存·知识库·rag
Rain的Java大神之路39 分钟前
面了 50 个候选人,90% 都挂在 LeetCode 3 无重复字符的最长子串:滑动窗口的 5 个致命坑
java·后端·leetcode
西凉的悲伤40 分钟前
Jsoup 库 HTML 解析详解
java·前端·html·jsoup
qq_401700411 小时前
Qt Modbus 源码剖析:从 QModbusClient 到工业级通信框架
开发语言·qt·系统架构
星夜离尘561 小时前
MATLAB 角度解缠遇到丢样:先分段,再说明圈数为什么不可恢复
开发语言·matlab
十碗饭吃不饱1 小时前
Apache POI 踩坑:setFontFamily 二次设置字体不生效、样式残留问题深度解析
java·word·apache
我命由我123451 小时前
6-2.Python 异常处理 - 异常捕获(捕获指定异常、常见异常类型、异常信息)
java·运维·开发语言·python·http·https·java-ee