Lambda表达式和Stream介绍
Posted 小布丁value
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lambda表达式和Stream介绍相关的知识,希望对你有一定的参考价值。
Lambda表达式是一个匿名函数,
Java8新特性-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介绍的主要内容,如果未能解决你的问题,请参考以下文章
还看不懂同事的代码?超强的 Stream 流操作姿势还不学习一下