本文已参与「新人创作礼」活动,一起开启掘金创作之路。
方法引用和构造器引用
概述
- Lambda 表达式是用来简化函数式接口的变量或形参赋值的语法,而方法引用和构造器引用是为了简化 Lambda 表达式的。
- 当 Lambda 表达式满足如下的一些特殊情况,还可以再简化:
- ① Lambda 体只有一条语句,并且是通过调用一个对象(或类)的方法来完成的。
- 例如:System.out 对象,调用 println() 方法来完成 Lambda 体。Math 类,调用 random() 静态方法来完成 Lambda 体。
- ② Lambda 表达式的形参正好是给该方法的实参。
- 例如:
t -> System.out.println(t)
,()->Math.random()
。
方法引用
- 语法:
- 实例对象名::实例方法
- 类名::静态方法
- 类名::实例方法
- 说明:
::
是方法引用操作符。
- Lambda 表达式的形参列表全部在 Lambda 体中使用了,要么作为调用方法的对象,要么作为调用方法的实参。
- 在整个 Lambda 中没有额外的数据。
示例1:
package com.github.demo13;
import java.util.Arrays;
import java.util.List;
public class Test {
public static void main(String[] args) {
List<Integer> map = Arrays.asList(1, 2, 3, 4, 5);
map.forEach(System.out::println);
}
}
示例2:
package com.github.demo14;
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
String[] arr = {"hello", "world", "java", "c"};
Arrays.sort(arr, String::compareToIgnoreCase);
Arrays.asList(arr).forEach(System.out::println);
}
}
示例3:
package com.github.demo15;
import java.util.stream.Stream;
public class Test {
public static void main(String[] args) {
Stream.generate(Math::random).limit(10).forEach(System.out::println);
}
}
构造器引用
- 语法:
- 类名::new
- 数组类型::new
- 说明:
- 当 Lambda 表达式是为了创建一个对象,并且满足 Lambda 表达式形参,正好是创建给这个对象的构造器的实参列表。
- 当 Lambda 表达式是为了创建一个数组对象,并且满足 Lambda 表达式形参,正好是创建这个数组对象的长度 示例1:
package com.github.demo16;
import java.util.stream.Stream;
public class Test {
public static void main(String[] args) {
Stream<Integer> stream = Stream.of(1, 2, 3);
Stream<int[]> stream1 = stream.map((i) -> new int[i]);
// Lambda表达式
stream1.forEach((i) -> System.out.println(i.length));
System.out.println("---------------------");
Stream<Integer> stream11 = Stream.of(1, 2, 3);
Stream<int[]> stream2 = stream11.map(int[]::new);
// 构造引用
stream2.forEach((i) -> System.out.println(i.length));
}
}
示例2:
package com.github.demo17;
import java.math.BigDecimal;
import java.util.stream.Stream;
public class Test {
public static void main(String[] args) {
Stream<String> stream = Stream.of("1", "2", "3");
Stream<BigDecimal> stream1 = stream.map(s -> new BigDecimal(s));
stream1.forEach(System.out::println);
System.out.println("---------------");
Stream<String> stream11 = Stream.of("1", "2", "3");
Stream<BigDecimal> stream2 = stream11.map(BigDecimal::new);
stream2.forEach(System.out::println);
}
}