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 中,有两种常用的匹配模式:
allMatch: 是否全部元素都满足要求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 流处理数据后,可以根据某个属性来将数据进行分组。
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 分区
2.9 拼接
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);