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