方法引用与构造器引用
关于lambda表达式,我们已经知道了,一般是有两部分组成。箭头操作符(->)左侧是lambda体的参数列表,右侧是lambda体,而lambda体里面的操作,有些情况下可以有另一种写法,更加简短。
可以理解这种写法是lambda表达式的另外一种表现形式,这种写法我们大致可以分为三类,方法引用、构造器引用、数组引用,一般语法格式为X::Y,下面分别看一下。
方法引用
1.对象::实例方法名
/***
* 方法引用1
*/
@Test
public void test01() {
String msg = "hello lambda!";
// lambda体中的功能已经有方法完成 可以使用 方法引用
Consumer consumer = str -> System.out.println(msg);
consumer.accept(msg);
// PrintStream对象
PrintStream printStream = System.out;
// 接口的方法 的参数列表和返回值类型 和 方法引用的 方法 参数列表和返回值类型保持一致
Consumer<String> consumer2 = printStream::println;
consumer2.accept("hello lambda");
}
2.类::实例方法名
/***
* 方法引用2
*/
@Test
public void test01() {
String msg = "hello lambda!";
// lambda体中的功能已经有方法完成 可以使用 方法引用
Consumer consumer = str -> System.out.println(msg);
consumer.accept(msg);
// PrintStream对象
PrintStream printStream = System.out;
// 接口的方法 的参数列表和返回值类型 和 方法引用的 方法 参数列表和返回值类型保持一致
Consumer<String> consumer2 = printStream::println;
consumer2.accept("hello lambda");
}
3.类::实例方法名
/***
* 方法引用3
* pow是Math类的方法
*/
@Test
public void test03() {
// lambda 表达式之前的写法
BinaryOperator<Double> binaryOperator = (x, y) -> Math.pow(x, y);
System.out.println(binaryOperator.apply(2d, 3d));
// 接口的方法 的参数列表和返回值类型 和 方法引用的 方法 参数列表和返回值类型保持一致
BinaryOperator<Double> binaryOperator2 = (x, y) -> Math.pow(x, y);
System.out.println(binaryOperator2.apply(2d, 3d));
}
构造器引用
与函数式接口相结合,自动与函数式接口中方法兼容。可以把构造器引用赋值给定义的方法,与构造器参数 列表要与接口中抽象方法的参数列表一致,默认使用空的构造器
@Test
public void test05() {
// 获取一个MyClass类型的实例
Supplier<MyClass> myClassSupplier=MyClass::new;
// 获取一个Object类型的实例
Supplier<Object> objectSupplier = Object::new;
}
数组引用
利用数组初始化一个Integer数组
@Test
public void test06() {
int size = 10;
Function<Integer, Integer[]> function = (n) -> new Integer[n];
Integer[] integers = function.apply(size);
}
我的小结
当lambda体内的操作已经有方法实现了,这是的lambda体可以采用方法引用这种方式书写,代码更紧凑简洁,减少冗余。很重要的一点是:接口的方法的参数列表和返回值类型和方法引用的方法,参数列表和返回值类型保持一致
文章首发于黑猫のBlog欢迎来留言啊!!!
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。