定义方法引用
对象::实例方法名类::静态方法名类::实例方法名 构造器引用数组引用附
定义方法引用: 可以看作lambda表达式深层次的表达,方法引用作为函数式接口的一个实例,可通过方法名来指向方法;可认为是lambda表达式的一个语法糖。
语法格式: 使用操作符 :: 将类/对象与方法名分割开。
使用场景:
- 对象::实例方法名类::静态方法名类::实例方法名
注意: 强两种场景下接口中抽象方法的形参列表和返回值要与方法应用的形参列表和返回值类型相同
方法引用举例:Consumer consumer1 = System.out::println;
对象::实例方法名@Test
public void test6(){
// 获取对象
PrintStream obj = System.out;
// 引用对象实例方法
Consumer consumer1 = obj::println;
HashMap map = new HashMap<>();
IntSupplier intSupplier = map::size;
}
类::静态方法名
@Test
public void test8() {
Comparator comparator = (a, b) -> {
return Integer.compare(a, b);
};
Comparator comparator1 = Integer::compare;
comparator.compare(1, 2);
}
类::实例方法名
适用于第一个参数作为调用对象,参数二开始为调用参数。
// 一个入参
@Test
public void test7() {
Comparator comparator = String::compareTo;
Comparator comparator1 = (a, b) -> a.compareTo(b);
comparator.compare("a", "b");
}
// 多入参例子 @FunctionalInterface interface LambdaI构造器引用{ T test(T s1,T s2,T s3); } class LambdaD{ LambdaD test(LambdaD s1,LambdaD s2){ return new LambdaD(); } } class Demo{ @Test public void test9(){ LambdaI result = new LambdaI () { @Override public LambdaD test(LambdaD s1, LambdaD s2,LambdaD s3) { return s1.test(s1, s2); } }; LambdaI result1 = LambdaD::test; } }
与方法引用类似,函数式接口抽象方法的形参列表与构造器形参列表一致,返回值为构造器所属类的类型时
类 :: new
@Test
public void test10(){
Supplier supplier = HashMap::new;
Function frmo = TestClass::new;
}
class TestClass{
private String name;
public TestClass(String name) {
this.name = name;
}
}
数组引用
数组引用是构造器引用的一种,相当于将数组看作一个特殊的类。
@Test
public void test11(){
Function function = Object[] :: new;
}
附
lambda使用之函数式接口
lambda语法及使用
java中的引用



