JDK8的Stream流操作

人人都说我丑,其实我只是美得不明显 --smilefyou

Stream流的相关操作

特性
不是数据结构,没有内部存储。
不支持索引访问。
延迟计算
支持并行
很容易生成数据或集合
支持过滤,查找,转换,汇总,聚合等操作。
机制
1.Stream分为创建操作,中间操作,终止操作。
2.流的源可以是一个数组,集合,生成器方法,I/O通道等等
3.一个流可以有零个或多个中间操作,每一个中间操作都会返回一个新的流,供下一个操作使用,一个流只会有一个终止操作。
4.Stream只有遇到终止操作,它的源才会开始执行遍历操作。
创建操作
数组:Stream.of()
集合:stream()
通过Stream.generate方法来创建
通过Stram.iterate方法
其他
中间操作
1.distinct去重
List<Integer> list = Arrays.asList(1, 2, 1, 3, 3, 2, 4);
List<Integer> newList = list.stream().distinct().collect(Collectors.toList());
2.filter 过滤
list.stream().filter(i -> i % 2 == 0).collect(Collectors.toList());
3.sorted 排序
list.stream().sorted().collect(Collectors.toList());//默认自然排序从小到大
list.stream().sorted(Comparator.reverseOrder()).collect(Collectors.toList());//倒序
list.stream().sorted(Comparator.comparing(User::getAge)).collect(Collectors.toList());
limit && skip
list.stream().limit(1).collect(Collectors.toList());
list.stream().skip(1).collect(Collectors.toList());
map归纳
list.stream().map(object::getName).collect(Collectors.toList());
终止操作
collect收集
list.stream().limit(2).collect(Collectors.toList());
list.stream().limit(2).collect(Collectors.toSet());
list.stream().limit(2).collect(Collectors.toMap(Object::getName, Object::getAge));
计算 min、max、count、average
Optional<Integer> min = list.stream().reduce(Integer::min);
Optional<Integer> max = list.stream().reduce(Integer::max);
anyMatch 匹配任意一个
boolean b = list.stream().anyMatch(Object::isDel);
allMatch 匹配所有
boolean b = list.stream().allMatch(o -> o.getAge() < 30);
noneMatch 都不匹配
boolean b = list.stream().noneMatch(o -> o.getAge() > 30);
findFirst
Optional<Object> optional = list.stream().filter(Object::isDel).findFirst();
findAny
Optional<Object> optional = list.stream().filter(Object::isDel).findAny();
reduce 规约
List<Integer> list = Arrays.asList(1, 2, 3, 6, 8);
Integer reduce = list.stream().reduce(0, (a, b) -> a + b);
Collectors 收集器
计算总和: int i = list.stream().collect(Collectors.summingInt(Object::getMath));

Comparator<Object> 比较器 = Comparator.comparingInt(Object::getAge);
流中最大值: Optional<Object> optional = list.stream().collect(Collectors.maxBy(比较器));
流中最小值: Optional<Object> optional = list.stream().collect(Collectors.minBy(比较器));
summingInt 汇总
int collect = list.stream().collect(Collectors.summingInt(Object::getNum));
averagingInt 平均数
 Double average = list.stream().collect(Collectors.averagingInt(Object::getNum));
joining连接字符串
String names = dish.stream().map(Object::getName).collect(Collectors.joining());

String names = dish.stream().map(Object::getName).collect(Collectors.joining(","));
counting 总数
long sum = list.stream().collect(Collectors.counting());
grouping By 分组
Map<Object.Type, List<Dish>> collect = list.stream().collect(Collectors.groupingBy(Object::getType));3

//自定义分组条件
Map<String, List<Person>> collect = list.stream().collect(Collectors.groupingBy(Person->{
        if (Person.getAge() <= 18) {
            return "未成年";
        } else if (Person.getAge() <= 40) {
            return "中年";
        } else {
            return "老年";
        }
    }));
多级分组
 Map<Person.Type, Map<String, List<Person>>> collect = list.stream().collect(Collectors.groupingBy(Person::getSex, Collectors.groupingBy(p -> {
        if (p.getAge() <= 18) {
            return "未成年";
        } else if (p.getAge() <= 40) {
            return "中年";
        } else {
            return "老年人";
        }
    })));

如有疑问或不同见解,欢迎留言共同交流,博主看到后会在第一时间回复哦

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/mrhs_dhls/article/details/105974340