stream流

什么是stream

Stream 是 Java8 的新特性,它允许你以声明式的方式处理数据集合和数组,可以把它看作是遍历数据集的高级迭代器。此外与 stream 与 lambada 表达示结合后编码效率与大大提高,并且可读性更强。

要澄清的是 java8 中的 stream 与 InputStream 和 OutputStream 是完全不同的概念.

特点:

  1. 不是数据结构,不会保存数据。
  2. 不会修改原来的数据源,它会将操作后的数据保存到另外一个对象中。(保留意见:毕竟peek方法可以修改流中元素)
  3. 惰性求值,流在中间处理过程中,只是对操作进行了记录,并不会立即执行,需要等到执行终止操作的时候才会进行实际的计算。

我们使用stream流只需要 说明想要完成什么(筛选,排序,取值),而不说明如何实现一个操作(for 循环)。同时可以将这些操作链接起来,达到一种流水线式的效果

在这里插入图片描述

在这里插入图片描述

什么是流呢:简单的定义,就是“从支持数据处理操作的源,生成的元素序列

数据处理操作:流更偏向于数据处理和计算,比如 filter、map、find、sort 等

​ 简单来说,我们通过一个集合的 stream 方法获取一个流,然后对流进行一 系列流操作,最后再构建成我们需要的数据集合

获取流

在这里插入图片描述

流操作

中间操作

  • filter:过滤流中的某些元素,
  • sorted(): 自然排序,流中元素需实现 Comparable 接口
  • distinct: 去除重复元素
  • limit(n): 获取 n 个元素
  • skip(n): 跳过 n 元素,配合 limit(n)可实现分页
  • map(): 将其映射成一个新的元素

终端操作

  • forEach: 遍历流中的元素
  • toArray:将流中的元素倒入一个数组
  • collect:将流中的元素倒入一个集合,Collection 或 Map
  • Min:返回流中元素最小值
  • Max:返回流中元素最大值
  • count:返回流中元素的总个数
  • Reduce:所有元素求和
  • anyMatch:接收一个 Predicate 函数,只要流中有一个元素满足条件则返回 true,否则返回 false
  • allMatch:接收一个 Predicate 函数,当流中每个元素都符合条件时才返 回 true,否则返回 false
  • findFirst:返回流中第一个元素

示例

1、过滤,排序,去重,跳过,获取前几个,遍历

public class Demo1 {
    public static void main(String[] args) {
        Stream.of(1, 2, 3, 9, 4, 5).filter((e) -> {
            return !Objects.equals(e, 2);
        }).sorted(((o1, o2) -> {
            return o2 - o1;
        })).distinct().skip(1).limit(5).forEach(System.out::println);
    }
}

2、是否有满足条件的

public class Demo2 {
    public static void main(String[] args) {
        boolean b = Stream.of(5, 9, 6, 3, 3, 4).distinct().anyMatch((e) -> {
            return e > 6;
        });
        System.out.println(b);
    }
}

3、map

public class Demo3 {

    public static void main(String[] args) {
        ArrayList<Apple> list = new ArrayList<>();
        list.add(new Apple(101,"苹果1","红色"));
        list.add(new Apple(102,"苹果2","绿色"));
        list.add(new Apple(103,"苹果3","黄色"));
        list.add(new Apple(104,"苹果4","红色"));

        /*
            map(方法):  将某个值 映射到Stream中
         */
        list.stream().map(Apple::getNum).forEach(System.out::println);

        //编号逆序排序转集合
        List<Apple> collect = list.stream().sorted((app1, app2) -> {
            return app2.getNum() - app1.getNum();
        }).collect(Collectors.toList());
        System.out.println(collect);

        //用map输出所需列(无序)
        Map<Integer, String> map = list.stream().collect(Collectors.toMap(Apple::getNum, Apple::getName));
        System.out.println(map);
    }
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

EnndmeRedis

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值