Lambda表达式和Stream介绍

Posted 小布丁value

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lambda表达式和Stream介绍相关的知识,希望对你有一定的参考价值。

Lambda表达式是一个匿名函数,

使用示例Lambda表达式是一个匿名函数

        HashMap <String, String> hashMap = new HashMap <>();
        hashMap.put("A","AA");
        hashMap.put("B","BB");
        hashMap.put("C","CC");
        通过lambda来遍历map集合
        hashMap.forEach((String k, String v)->{
            System.out.println(k+":"+v);
        });
        ArrayList <Integer> list = new ArrayList <>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        通过lambda来遍历list集合
        list.forEach(V -> System.out.println(V));

运行结果:
在这里插入图片描述
特点:

1.一个lambda可以有>=0个参数,换句话说,参数任意
2.参数类型可以自己声明,也可以不生命,他会自己 根据上下文判断
3.所有参数都是在()中,(int a) 和(a)表达的含义是一样的
4.参数可以为空;()->()
5.5、lambda表达式的主体可以包含零条或者多条语句,只有一条语句时,可以省略{}号,如果 有多条语句需要加上{}括号

lambda表达式可以代替匿名内部类使用

//通过匿名内部类的形式来创建子线程       
new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("匿名的多线程方式");
            }
        }).start();
//通过lambda表达式创建多线程
        new Thread(()->{
            System.out.println("匿名的多线程方式1");
            System.out.println("匿名的多线程方式2");
            System.out.println("匿名的多线程方式3");
        }).start();

Java8新特性-Stream(教学版)

Stream介绍

Stream和Collection的区别就是:Collection只是负责存储数据,不对数据做其他处理,主要是和内存打交道。但是Stream主要是负责计算数据的,主要是和CPU打交道。
大数据中Spark

Stream 特性:

无存储。Stream 不是一种数据结构,它只是某种数据源的一个视图,数据源可以是一个数组,Java 容器或 I/O channel 等。
为函数式编程而生。对 Stream 的任何修改都不会修改背后的数据源,比如对 Stream
执行过滤操作并不会删除被过滤的元素,而是会产生一个不包含被过滤元素的新 Stream。 惰式执行。Stream
上的操作并不会立即执行,只有等到用户真正需要结果的时候才会执行。 可消费性。Stream 只能被 " 消费 "
一次,一旦遍历过就会失效,就像容器的迭代器那样,想要再次遍历必须重新生成。

Stream操作步骤

Stream执行流程很简单,主要有三个:
1、创建一个Stream:从一个数据源,如集合、数组中获取流
2、使用Stream操作数据:一个操作的中间链,对数据源的数据进行操作
3、终止Stream:一个终止操作,执行中间操作链,并产生结果
要注意的是,对流的操作完成后需要进行关闭操作
在这里插入图片描述

创建Stream

方式一:通过集合创建Stream

  List <Student> list = getStudentDate();
        //创建的顺序流
        Stream <Student> stream = list.stream();
        //创建一个并行流
        Stream <Student> studentStream = list.parallelStream();

方式二:通过一个数组创建stream

    int []arr = {1,2,3,4,5,6,8};
        IntStream stream1 = Arrays.stream(arr);

方式三:通过Stream.of

Stream <String> stringStream = Stream.of("1", "2", "3");      

方式四:创建一个无限流

Stream <Double> generate = Stream.generate(Math::random);

Stream操作数据
操作1:筛选和切片

在这里插入图片描述

        //过滤:找到年龄大于12的学生信息
//        stream.filter(item->item.getAge() > 12);
        //截断流:获取前三个学生信息
//        stream.limit(3);
        //跳过流:跳过前3个用户信息
//        stream.skip(3);

        //重复流:需要对操作的类的hashcode和equal比较
        stream.distinct();

操作2:
映射

在这里插入图片描述
操作3:排序
在这里插入图片描述
终止Stream
终止操作会从流的流水线生成结果。其结果可以是任何不是流的值,例如List、Integer 甚至是void。
操作1:匹配和查找
在这里插入图片描述
在这里插入图片描述
操作2:归约
在这里插入图片描述
操作3:收集
在这里插入图片描述
Collector接口中方法的实现决定了如何对流执行收集操作(如收集到List、Set、Map)。但是Collector实用类提供了很多静态方法可以方便的收集常见实例
在这里插入图片描述
在这里插入图片描述

以上是关于Lambda表达式和Stream介绍的主要内容,如果未能解决你的问题,请参考以下文章

Java8 - Lambda和Stream

还看不懂同事的代码?超强的 Stream 流操作姿势还不学习一下

Lambda 表达式延申-Stream基础

初识Java8新特性Lambda(三 ) 之lambda类库Stream

lambda表达式与Stream流(非io)

Java8特性详解 lambda表达式 Stream