Lambda表达式 & 引用 & Stream流
1. Lambda表达式
-
Lambda表达式的使用前提
-
有一个接口
-
接口有且仅有一个抽象方法
-
-
省略规则:
- 参数类型可以省略,但是有多个参数的情况下,不能只省略一个
- 如果参数有且仅有一个,那么小括号可以省略
- 如果代码块的语句只有一条,可以省略大括号和分号,有return,return也要一起省略
-
Lambda表达式和匿名内部类的区别
- 所需类型不同:
- 匿名内部类:可以是接口,也可以是抽象类,还可以是具体类
- Lambda表达式:只能是接口
- 使用限制不同:
- 如果接口中有且仅有一个抽象方法,可以使用Lambda表达式,也可以使用匿名内部类
- 如果接口中多于一个抽象方法,只能使用匿名内部类,而不能使用Lambda表达式
- 实现原理不同
- 匿名内部类:编译之后,产生一个单独的.class字节码文件
- Lambda表达式:编译之后,没有一个单独的.class字节码文件。对应的字节码会在运行的时候动态生成
- 所需类型不同:
2. 引用
-
常见的引用方法
-
引用类方法
-
格式:类名:类方法
-
范例:Integer::parseInt
Integer类的方法:public static int parseInt(String s)将此String转换为int类型数据
-
-
引用对象的实例方式
-
格式:对象::成员方法
-
范例:“HelloWorld”::toUpperCase
String类中的方法:public String toUpperCase()将此String所有字符串转换为大写
-
-
引用类的实例方法
-
格式:类名::成员方法
-
范例:String::substring
String类中方法:public String concat(String str):用于拼接字符串
-
-
引用构造器
-
格式:类名::new
-
范例:HashMap::new
创建一个HashMap对象
-
-
3. Stream流
-
流的使用
-
生成流
通过数据源(集合、数组等)生成流例:list.stream()
-
中间操作
一个流后面可以跟随零个或多个中间操作,其目的只要是打开流,做出某种程度的数据过滤/映射,然后返回一个新的流,交给下一个操作使用例:filter()
-
终结操作
一个流只能有一个终结操作,当这个操作执行后,流就被使用“光“了,无法再被操作,所以这必定是流的最后一个操作
例:forEach()
-
-
Stream流的生成方式
- Collection体系的集合可以使用默认方法stream()生成流
default Stream stream() - Map体系的集合间接的生成流
- 数组可以通过Stream接口的静态方法of(T…values)生成流
- Collection体系的集合可以使用默认方法stream()生成流
-
常见中间操作方法
-
Stream filter(Predicate predicate):用于对流中的数据进行过滤
Predicate接口中的方法 boolean test(T t):对给定的参数进行判断,返回一个布尔值 -
Stream limit(long maxSize):返回此流中的元素组成的流,截取指定参数个数的数据
-
Stream skip(long n):跳过参数个数的数据,返回由该流的剩余元素组成的流
-
static Stream concat(Stream a, Stream b):合并a和b两个流为一个流
-
Stream distinct():返回由该流的不同元素(根据Object.equals(Object))组成的流
-
Stream sorted():返回由此流的元素组成的流,根据自然顺序排序
-
Stream sorted(Comparator comparator):返回由该流的元素组成的流,根据提供的Comparator进行排序
-
Stream map(Function mapper):返回由给定函数应用于此流的元素结果组成的流
Function接口中的方法 R.apply(T t) -
InStream map Tolnt(TolntFunction mapper):返回一个IntStream其中包含将给定函数应用于此流的元素的结果
IntStream:表示原始int流
ToIntFunction接口中的方法 int apply(T value)
-
-
常见终结操作方法
-
void forEach(Consumer action):对此流的每个元素执行操作
Consumer接口中的方法 void accept(T t):对给定的参数执行此操作
-
long count():返回此流中的元素数
-
collect(Collector<? super T, A, R>):获取一个新的集合
-