• Java stream/流 的使用


    参考

    建议

    建议在看 stream 之前,先学习 Java 的 Lambda 与 函数式接口。Java 四大函数式接口(函数型/断定型/消费型/供给型)

    代码

    简单使用

    package stream;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Locale;
    
    /**
     * @Author 夏秋初
     * @Date 2022/3/4 10:34
     */
    public class Test1 {
        public static void main(String[] args) {
            User user1 = new User("张三", 18, "爱学习", "zhangsan");
            User user2 = new User("李四", 23, "爱工作", "lisi");
            User user3 = new User("王五", 30, "爱家庭", "wangwu");
            User user4 = new User("马六", 10, "爱玩", "maliu");
            User user5 = new User("赵七", 18, "不爱学习", "zhaoqi");
            List<User> userList = Arrays.asList(user1, user2, user3, user4, user5);
            // 返回此流中元素的数量
            System.out.println(userList.stream().count());
            System.out.println("==count==");
            // 对此流的每个元素执行操作
            userList.stream().forEach(item->System.out.println(item));
            System.out.println("==forEach==");
            // 返回由与此给定谓词匹配的此流的元素组成的流
            userList.stream().filter(item->item.age > 22).forEach(item->System.out.println(item));
            System.out.println("==filter==");
            // 返回Optional描述流的一些元件,或一个空Optional如果流是空的。
            System.out.println(userList.stream().findAny());
            System.out.println("==findAny==");
            // 返回Optional描述此流的第一个元素,或空Optional如果流是空的。
            System.out.println(userList.stream().findFirst());
            System.out.println("==findFirst==");
            // 返回由此流的元素组成的流,截断长度不超过 maxSize 。
            userList.stream().limit(2).forEach(item->System.out.println(item));
            System.out.println("==limit==");
            // 返回一个流,该流包含将给定函数应用于此流的元素的结果。
            userList.stream().map(item-> item.englishName.toUpperCase()).forEach(item->System.out.println(item));
            System.out.println("==map1==");
            userList.stream().map(item->{
                item.englishName = item.englishName.toUpperCase();
                return item;
            }).forEach(item->System.out.println(item));
            System.out.println("==map2==");
            // 返回由此流的元素组成的流,另外在每个元素上执行提供的操作,因为元素是从结果流中消耗的。
            userList.stream().peek(item->{
    //            item.age = 18;
            }).forEach(item->System.out.println(item));
            System.out.println("==peek==");
        }
    }
    class User{
        public String name;
        public Integer age;
        public String desc;
        public String englishName;
    
        public User(String name, Integer age, String desc, String englishName) {
            this.name = name;
            this.age = age;
            this.desc = desc;
            this.englishName = englishName;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", desc='" + desc + '\'' +
                    ", englishName='" + englishName + '\'' +
                    '}';
        }
    }
    

    输出

    5
    ==count==
    User{name='张三', age=18, desc='爱学习', englishName='zhangsan'}
    User{name='李四', age=23, desc='爱工作', englishName='lisi'}
    User{name='王五', age=30, desc='爱家庭', englishName='wangwu'}
    User{name='马六', age=10, desc='爱玩', englishName='maliu'}
    User{name='赵七', age=18, desc='不爱学习', englishName='zhaoqi'}
    ==forEach==
    User{name='李四', age=23, desc='爱工作', englishName='lisi'}
    User{name='王五', age=30, desc='爱家庭', englishName='wangwu'}
    ==filter==
    Optional[User{name='张三', age=18, desc='爱学习', englishName='zhangsan'}]
    ==findAny==
    Optional[User{name='张三', age=18, desc='爱学习', englishName='zhangsan'}]
    ==findFirst==
    User{name='张三', age=18, desc='爱学习', englishName='zhangsan'}
    User{name='李四', age=23, desc='爱工作', englishName='lisi'}
    ==limit==
    ZHANGSAN
    LISI
    WANGWU
    MALIU
    ZHAOQI
    ==map1==
    User{name='张三', age=18, desc='爱学习', englishName='ZHANGSAN'}
    User{name='李四', age=23, desc='爱工作', englishName='LISI'}
    User{name='王五', age=30, desc='爱家庭', englishName='WANGWU'}
    User{name='马六', age=10, desc='爱玩', englishName='MALIU'}
    User{name='赵七', age=18, desc='不爱学习', englishName='ZHAOQI'}
    ==map2==
    User{name='张三', age=18, desc='爱学习', englishName='ZHANGSAN'}
    User{name='李四', age=23, desc='爱工作', englishName='LISI'}
    User{name='王五', age=30, desc='爱家庭', englishName='WANGWU'}
    User{name='马六', age=10, desc='爱玩', englishName='MALIU'}
    User{name='赵七', age=18, desc='不爱学习', englishName='ZHAOQI'}
    ==peek==
    
    进程已结束,退出代码为 0
    

    结合使用

    注意:如果排序的话,User 类需要实现 Comparable 接口。

    package stream;
    
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.List;
    import java.util.Locale;
    
    /**
     * @Author 夏秋初
     * @Date 2022/3/4 10:34
     */
    public class Test1 {
        /**
         *
         * @param args
         */
        public static void main(String[] args) {
            User user1 = new User("张三", 18, "爱学习", "zhangsan");
            User user2 = new User("李四", 23, "爱工作", "lisi");
            User user3 = new User("王五", 30, "爱家庭", "wangwu");
            User user4 = new User("马六", 10, "爱玩", "maliu");
            User user5 = new User("赵七", 18, "不爱学习", "zhaoqi");
            List<User> userList = Arrays.asList(user1, user2, user3, user4, user5);
            userList.stream()
                    // 筛选年龄大于10岁
                    .filter(item->item.age>10)
                    // 将英文名大写
                    .peek(item->item.englishName = item.englishName.toUpperCase())
                    // 正序排序
                    .sorted((item1, item2)->item1.compareTo(item2))
                    // 倒序排序
                    .sorted((item1, item2)->item2.compareTo(item1))
                    // 取出指定长度
                    .limit(3)
                    // 对每个元素执行打印
                    .forEach(item->System.out.println(item));
    
        }
    }
    //
    class User implements Comparable<User>{
        public String name;
        public Integer age;
        public String desc;
        public String englishName;
    
        public User(String name, Integer age, String desc, String englishName) {
            this.name = name;
            this.age = age;
            this.desc = desc;
            this.englishName = englishName;
        }
    
        @Override
        public String toString() {
            return "User{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", desc='" + desc + '\'' +
                    ", englishName='" + englishName + '\'' +
                    '}';
        }
    
        @Override
        public int compareTo(User o) {
            if(this.age > o.age){
                return 1;
            }
            if(this.age < o.age){
                return -1;
            }
            return 0;
        }
    }
    

    输出

    User{name='王五', age=30, desc='爱家庭', englishName='WANGWU'}
    User{name='李四', age=23, desc='爱工作', englishName='LISI'}
    User{name='张三', age=18, desc='爱学习', englishName='ZHANGSAN'}
    
    进程已结束,退出代码为 0
    
  • 相关阅读:
    《构建之法》4、17章精读
    2016012005+小学四则运算练习软件项目报告
    Week2-作业一——《构建之法》三章精读之想
    虚拟到现实
    脚踏实地,莫问前程
    2016012010 赵瑞雪 散列函数的应用及其安全性
    结对项目报告
    《构建之法》第四章、第十七章读书笔记
    2016012010+小学四则运算练习软件项目报告
    《构建之法》第一、二、十六章读书笔记
  • 原文地址:https://www.cnblogs.com/xiaqiuchu/p/15963549.html
Copyright © 2020-2023  润新知