Java8中常用的新特性-Stream流

一句话

一个银行里被捉着做需求的开发人员进行自救。


一、我所理解的stream流

一种方便数据集合进行加工的工具,能够使代码更加简洁

  • 两种生成流的方式
    • stream()为集合创建串行流
    • parallelStream()为集合创建并行流。

二、常用操作

1.collect

  • 终止操作
  • 收集起来作为输出
  • collect(toList())
  • collect(toSet())

2.map

  • 中间操作
  • 将一种类型的值映射成另一种类型的值
  • 可将Stream流中的每一个值映射成新值
  • 用lambda表达式最香
  • 例如那种数据库中返回的数据是个对象集合,可是我只需要对象中的某个属性

3.filter

  • 中间操作
  • 过滤数据
  • 如果在数据库中做过滤时间消耗过大,那么可以在代码上做,这时候这个就很好用了
  • 用lambda表达式最香

4.flatMap

  • 中间操作
  • 合并Stream
  • 感觉运用场景不多怎么回事!
  • 一开始我以为是可以合并两个数组,后面发现我想多了,他是合并数组中的值,例如我原本是一个二维数组,现在可以将他扁平化成一个数组。
  • 行吧 后面发现基础类型int[][]数组也是不行,还是乖乖用String[]实现吧

5.reduce

  • 终止操作
  • 用于计算较多
  • max、min、count都是它的小弟,
  • 如果是数据库中拿到的数据做累加,那就很香了,可以直接先filter再reduce

6.findFirst

  • 终止操作
  • 获取第一个参数(替代get(0))
  • 通常与Optional一起用,用于get(0)时防止空指针

7.forEach

  • 终止操作
  • 做循环操作
  • 通常同于打印输出

8.peek

  • 中间操作
  • 用于Debug
  • 为什么会写进来是因为考虑到forEach可以做的事情peek也可以做,那为什么不用peek呢?然后查了一下,它不应该和forEach比较,应该和map比较,实际上peek并不会改变流,因为它操作后不会返回新的流回去,那么又引申出一个问题:当流里面的是对象,为什么会改到对象里面的值?答案如图
  • 在这里插入图片描述
    我们已经操作了元素(那个对象),那么无论它返不返回,对象里面的值都会是改了的。

实践代码:

/**
 * @author MatildaNi on 2021-12-14.
 * @version 1.0
 */
public class steamDemo {
    public static void main(String[] args) {
        String str = "my name is 007";

        Stream.of(str.split(" ")).filter(s -> s.length() > 2)
                .map(s -> s.length()).forEach(System.out::println);

        //常见操作1:collect:一种终止操作
        String strs[] = {"111","222","333","444"};
        List<String> collectDemo = Stream.of(strs).collect(Collectors.toList());
        System.out.println("常见操作1:collect:一种终止操作");
        for(String str1 : collectDemo) System.out.println(str1);

        //常见操作2:map:一种改变数据类型的方法
        List<String> mapDemo = Stream.of(str.split(" ")).map(s -> s.toUpperCase()).collect(Collectors.toList());
        System.out.println("常见操作2:map:一种改变数据类型的方法");
        for(String str1 : mapDemo) System.out.println(str1);

        //常见操作3:filter:一种过滤方法
        int [] testFilterDemo = new int[]{1,2,3,4,5};
        int [] filterDemo = Arrays.stream(testFilterDemo).filter(s -> s > 2).toArray();
        System.out.println("常见操作3:filter:一种过滤方法");
        for(int int1 : filterDemo) System.out.println(int1);

        //常见操作4:flatMap:合并Stream流
        String[] testFlatMapDemo = new String[]{"1,2,3,4,5","6,7,8,9,10"};
        String[] flatMapDemo = Arrays.stream(testFlatMapDemo).map(s -> s.split(",")).flatMap(Arrays::stream).toArray(String[]::new);
        System.out.println("常见操作4:flatMap:合并Stream流");
        for(String int1 : flatMapDemo) System.out.println(int1);

        //常见操作5:reduce:使用Stream的值进行计算
        int [] reduceDemo = new int[]{1,2,3,4,5};
        int maxResult = Arrays.stream(reduceDemo).max().getAsInt();
        System.out.println("常见操作5:reduce-max:找最大值");
        System.out.println(maxResult);
        int minResult = Arrays.stream(reduceDemo).min().getAsInt();
        System.out.println("常见操作5:reduce-min:找最小值");
        System.out.println(minResult);
        int sumResult = Arrays.stream(reduceDemo).reduce((x,y) -> x + y).getAsInt();
        System.out.println("常见操作5:reduce:累计值");
        System.out.println(sumResult);
        int sumResult2 = Arrays.stream(reduceDemo).reduce(5,(x,y) -> x + y);
        System.out.println("常见操作5:reduce:累计值(可有初始值),可能是我初始值是一个int,所以是不用加getAsInt");
        System.out.println(sumResult2);

        //常见操作6:findFirst:直接获取第一个元素
        int [] findFirstDemo = new int[]{1,2,3,4,5};
        int findFirstResult = Arrays.stream(findFirstDemo).findFirst().getAsInt();
        System.out.println("常见操作6:findFirst:直接获取第一个元素");
        System.out.println(findFirstResult);

        //常见操作7:forEach:直接看最前一个


    }
}

总结

好好学习lambda,卷死他们~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值