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
posted @ 2022-03-04 11:19  夏秋初  阅读(45)  评论(0编辑  收藏  举报