java8(二)— Stream

1.特点

  • 流水线: 中间流操作本身返回一个流

  • 内部迭代 : 不需要显式的遍历,只能遍历一次

  • 懒加载: 必须有中盾操作才会真正触发执行

2.操作

  • 中间操作
    • filter: 根据谓词过滤,借助Predicate<T>接口
    • map: 映射,借助Function<T,R>接口
    • flatmap: 平铺,借助Function<T, Stream<R>>接口
    • limit: 截取的结果数量
    • skip: 跳过流数量
    • sorted: 排序,借助Comparator<T>接口
    • distinct: 去重
  • 终端操作
    • forEach: 遍历,无返回值

    • count: 计数

    • collect: 收集器

    • allMatch: 内部迭代每个元素都匹配谓词

    • anyMatch: 内部迭代部分元素蒲培谓词

    • noneMatch: 内部迭代每个元素都不匹配谓词

    • reduce: 归约聚合

    • max: 最大值

    • min: 最小值

3.构建流

  • Stream.of(): 根据值构建流,例如Stream.of(1,2,3)

  • Arrays.stream():将数组或集合转换为流

  • IntStream.rangeClosed(start, end): 根据数值范围构建数值流,boxed()将树脂流转为普通流

  • Files.lines(Paths.get(path): 根据文件构建流

4.代码案例

  • 操作流
List<String> list = new ArrayList<>();
list.add("hello");
list.add("how");
list.add("are");
list.add("you");
list.add("tom");
list.stream().filter(s -> s.length() < 5).sorted(Comparator.reverseOrder()).forEach(System.out::println);
// flatMap将各个流扁平化
List<String> lt = list.stream().map(w -> w.split(" ")).flatMap(Arrays:: stream).collect(Collectors.toList());
// 查找和匹配
boolean b1 = list.stream().allMatch(s -> s.length() > 3); //每个元素都匹配
boolean b2 = list.stream().noneMatch(s -> s.length() > 3); //每个元素都不满足
Optional<String> str = list.stream().filter(s -> s.length() > 3).findFirst();//满足条件的第一个元素
// 归约
final Optional<Integer> reduce = Stream.iterate(1, n -> n + 1).limit(5).reduce((a, b) -> a * b);
final Optional<Integer> max = list.stream().map(String::length).max(Integer::compareTo);
// 收集器
final Long count = list.stream().collect(Collectors.counting());
final Integer sum = list.stream().collect(Collectors.summingInt(String::length));
final Double avg = list.stream().collect(Collectors.averagingDouble(String :: length));
final String joinStr = list.stream().collect(Collectors.joining());
final Optional<Integer> collectSum = list.stream().map(String::length).collect(Collectors.reducing((a, b) -> a + b));
final Map<String, List<Integer>> groupMap = list.stream().map(String::length)
        .collect(Collectors.groupingBy(n -> {
                if (n % 2 == 0) return "偶数";
                    else return "奇数";
            }));
  • 数值流
/数值流, 避免了装箱拆箱操作
final IntStream intStream1 = list.stream().mapToInt(String::length);
final IntStream intStream2 = IntStream.rangeClosed(1, 100).filter(n -> n % 2 == 0);
final Stream<Integer> boxed = intStream1.boxed(); // boxed数值流转换会对象流
  • 并行流
// parallel(): 将顺序流转为并行流,状态流不建议使用并行流
final Optional<Integer> reduceParall = Stream.iterate(1, n -> n + 1).limit(5).parallel().reduce((a, b) -> a * b);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值