Java Stream 的常见用法

117 阅读3分钟

1. 数据准备

首先为了展示各项stream功能,先做好基础数据准备

2. Stream 常见用法

2.1 过滤

Integer[] arr = Stream.of(1, 2, -1, -11, 8, 4, 5, 90, 66).filter(a -> a > 0).toArray(Integer[]::new);
System.out.println(Arrays.toString(arr));
// [1, 2, 8, 4, 5, 90, 66]

List<Integer> arr1 = Stream.of(1, 2, -1, -11, 8, 4, 5, 90, 66).filter(a -> a < 0).collect(Collectors.toList());
System.out.println(arr1);
[-1, -11]

2.2 匹配

Stream 中,有两种常用的匹配模式:

  1. allMatch: 是否全部元素都满足要求
  2. anyMatch: 是否存在一个元素满足要求
boolean b = Stream.of(1, 2, -1, -11, 8, 2, 1, 90, 66).allMatch(a -> a > 0);
System.out.println(b);
// false

boolean c = Stream.of(1, 2, -1, -11, 8, 2, 1, 90, 66).anyMatch(a -> a > 0);
System.out.println(c);
// true

2.3 去重

List<Integer> arr2 = Stream.of(1, 2, -1, -11, 8, 2, 1, 90, 66).distinct().collect(Collectors.toList());
System.out.println(arr2);
//[1, 2, -1, -11, 8, 90, 66]

2.4 排序

2.4.1 简单升序

List<String> strings = Arrays.asList("ac", "ddd", "123", "888", "dsuaio", "");
List<String> sorted = strings.stream().sorted().collect(Collectors.toList());
System.out.println(sorted);
// [, 123, 888, ac, ddd, dsuaio]

2.4.2 自定义排序

List<String> sorted = strings.stream().sorted((a,b)-> a.compareTo(b)*-1).collect(Collectors.toList());
System.out.println(sorted);
// [dsuaio, ddd, ac, 888, 123, ]

2.5 分组

当我们使用 Stream 流处理数据后,可以根据某个属性来将数据进行分组。

参考链接:juejin.cn/post/731236…

2.6 归约

List<Integer> llist = Arrays.asList( 1,2,3,4,5,6,7,8 );
//这种不可能为空
//首先把0作为x  然后0+1得到1  然后把1作为x  然后1+2  逐渐结合
Integer sun = llist.stream().reduce( 0, Integer::sum);

2.7 聚合

2.7.1 求最值

只求最小值或最大值

Integer maxAge = userList.stream().map(User::getAge).max(Integer::compareTo).get();
// maxAge: 30
log.info("maxAge: {}", maxAge);
Integer minAge = userList.stream().map(User::getAge).min(Integer::compareTo).get();
// minAge: 15
log.info("minAge: {}", minAge);

求最小值最大值所属对象

/**
 * Stream流数据--聚合操作
 * 备注:切记Stream流只能被消费一次,流就失效了
 * 如下只是示例代码
 * @author liuzebiao
 */
public class CollectDataToArray{
 
    public static void main(String[] args) {
        Stream<Student> studentStream = Stream.of(
                new Student("赵丽颖", 58, 95),
                new Student("杨颖", 56, 88),
                new Student("迪丽热巴", 56, 99),
                new Student("柳岩", 52, 77)
        );
 
        //聚合操作
        //获取最大值(Stream流 max()方法亦可)
        //max()方法实现
        //Optional<Student> max = studentStream.max((s1, s2) -> s1.getScore() - s2.getScore());
        //(聚合)实现
        Optional<Student> max = studentStream.collect(Collectors.maxBy((s1, s2) -> s1.getScore() - s2.getScore()));
        System.out.println("最大值:"+max.get());
 
        //获取最小值(Stream流 min()方法亦可)
        //min()方法实现
        //Optional<Student> min = studentStream.max((s1, s2) -> s2.getScore() - s1.getScore());
        //(聚合)实现
        Optional<Student> min = studentStream.collect(Collectors.minBy((s1, s2) -> s1.getScore() - s2.getScore()));
        System.out.println("最小值:"+min.get());
 
        //求总和(使用Stream流的map()和reduce()方法亦可求和)
        //map()和reduce()方法实现
        //Integer reduce = studentStream.map(s -> s.getAge()).reduce(0, Integer::sum);
        //(聚合)简化前
        //Integer ageSum = studentStream.collect(Collectors.summingInt(s->s.getAge()));
        //(聚合)使用方法引用简化
        Integer ageSum = studentStream.collect(Collectors.summingInt(Student::getAge));
        System.out.println("年龄总和:"+ageSum);
 
        //求平均值
        //(聚合)简化前
        //Double avgScore = studentStream.collect(Collectors.averagingInt(s->s.getScore()));
        //(聚合)使用方法引用简化
        Double avgScore = studentStream.collect(Collectors.averagingInt(Student::getScore));
        System.out.println("分数平均值:"+avgScore);
 
        //统计数量(Stream流 count()方法亦可)
        //count()方法实现
        //long count = studentStream.count();
        //(聚合)统计数量
        Long count = studentStream.collect(Collectors.counting());
        System.out.println("数量为:"+count);
    }
}

2.8 分区

参考链接:juejin.cn/spost/73124…

2.9 拼接

参考链接:juejin.cn/post/731241…

2.10 其他

2.10.1 计数

long count = userList.stream().filter(u -> u.getAge() > 25).count();
// count: 2
log.info("count: {}", count);
List<Integer> list = Stream.iterate(0, s -> s + 2).limit(5).collect(Collectors.toList());
// list: [0, 2, 4, 6, 8]
log.info("list: {}", list);

2.10.2 跳过

users = userList.stream().skip(4).collect(Collectors.toList());
// users: [User(id=5, username=rust, age=null)]
log.info("users: {}", users);

2.10.3 遍历

users3.forEach(item -> {
   System.out.println(item.getName() + item.getAge() + item.getEmailAddress());
});

2.10.4 比较大小

a.compareTo(b)

List<String> sorted = strings.stream().sorted((a,b)-> a.compareTo(b)*-1).collect(Collectors.toList());
System.out.println(sorted);

3 Stream 转换为其他数据类型

参考链接:juejin.cn/post/731237…