lambda和Stream流
- 1.lambda表达式,前提:只能简化函数式接口的匿名内部类
- 2.函数式接口:只允许有一个抽象方法,其他的方法不管
- 3.lambda表达式,编译的时候,它咋知道我是实现的哪一个接口?
- 4.lambda表达式是一个对象
- 5.lambda表达式和匿名内部类区别(1并不是2的语法糖)
- 4.{return ;}要省略就一起省略
- 5.lambda什么时候用啊?
- 6.lambda不能抛异常,只能在方法中trycatch。
- 7.Stream只能用一次,用完就会被销毁,每一步都会生成新的Stream流对象。
- 8.Stream线程不安全
- 9.foreach:输出有序
- 10.把stream流对象转换为List:
- 11.while和for循环写在代码块里面和外面有区别么
- 12.stream流在效率上比传统的for 和foreach循环效率高。
1.lambda表达式,前提:只能简化函数式接口的匿名内部类
(参数列表)—>{方法体}
2.函数式接口:只允许有一个抽象方法,其他的方法不管
3.lambda表达式,编译的时候,它咋知道我是实现的哪一个接口?
在方法中被写死了
public static void sort(T[] a, Comparator c)
像这个一样,sort方法只能传递Comparator接口的实现类对象,方法已经写死了
4.lambda表达式是一个对象
5.lambda表达式和匿名内部类区别(1并不是2的语法糖)
1)所需的类型不一样
如果是匿名内部类,那么可以用接口,也可以用抽象类,甚至可以是普通的实体类
如果是lambda表达式,就只能用接口
2)使用的限制不一样
如果接口当中有且只有一个抽象方法时,那么可以使用lambda表达式,也可以使用匿名内部类
但是如果接口当中抽象方法不唯一时,那么就只能使用匿名内部类,不能使用lambda表达式
3)实现的原理不一样
匿名内部类:其实本身就是一个类,编译之后,直接产生一个单独的.class字节码文件
lambda表达式:编译之后,没有单独的.calss字节码文件,对应的字节码文件会在运行的时候生成(效率提高)
4.{return ;}要省略就一起省略
5.lambda什么时候用啊?
1)lambda:简化多线程匿名内部类
2)Stream流:使用Lambda
3)看源码的时候
6.lambda不能抛异常,只能在方法中trycatch。
7.Stream只能用一次,用完就会被销毁,每一步都会生成新的Stream流对象。
要想操作流,首先需要有一个数据源,可以是数组或者集合。每次操作都会返回一个新的流对象,方便进行链式操作,但原有的流对象会保持不变。
Stream.of()—可变参数测数组类型必须是包装类。
否则Stream.of(int[] arr = {1,2,3,4})—数组作为可变参数的一个参数
8.Stream线程不安全
9.foreach:输出有序
10.把stream流对象转换为List:
List list = stream.collect(Collectors.toList());
11.while和for循环写在代码块里面和外面有区别么
里边:获取一次锁
外部:每次循环都必须从新获取锁
12.stream流在效率上比传统的for 和foreach循环效率高。
在串行处理操作中,Stream 在执行每一步中间操作时,并不会做实际的数据操作处理,而是将这些中间操作串联起来,最终由终结操作触发,生成一个数据处理链表,通过 Java8 中的 Spliterator 迭代器进行数据处理;此时,每执行一次迭代,就对所有的无状态的中间操作进行数据处理,而对有状态的中间操作,就需要迭代处理完所有的数据,再进行处理操作;最后就是进行终结操作的数据处理。
在并行处理操作中,Stream 对中间操作基本跟串行处理方式是一样的,但在终结操作中,Stream 将结合 ForkJoin 框架对集合进行切片处理,ForkJoin 框架将每个切片的处理结果 Join 合并起来。最后就是要注意 Stream 的使用场景。