五、方法引用
-
方法引用:是Lambda表达式的另一种表现形式。
-
使用场景:Lambda体中调用方法的参数列表与返回值类型,与函数式接口中抽象方法的参数列表和返回值一致时
-
常见的方法引用形式:
-
实例方法引用:(args)->expr.method(args);
-
格式:expr::method
Consumer<String> c= (s)-> System.out.println(s); c.accept("Lambda表达式的基础形式...."); Consumer<String> c2=System.out::println; c2.accept("Lambda表达式的方法引用形式..");
-
-
静态方法引用:(args)->ClassName.method(args);
-
格式:ClassName::method
Comparator<Integer> c3= (x,y)->Integer.compare(x,y); //基础形式 Comparator<Integer> c4=Integer::compare; //方法引用形式 int r=c4.compare(5,7); System.out.println("5和7的大写比较结果为:"+r);
-
-
特殊情况方法引用:(A a, B b) ->A.method(b);
-
格式:A::method
-
注意:若Lambda参数列表中的第一个参数是实例方法的调用者,而第二个参数是实例方法的参数时,才能应用此处引用方式(还需要注意两个方法的返回值类型相同)
BiPredicate<String,String> bp = (s1,s2)->s1.equals(s2); BiPredicate<String,String> bp2=String::equals; boolean b=bp2.test("hello","world"); System.out.println("两个字符串的比较结果:"+b);
-
-
构造方法引用:
-
无参数的构造方法引用:() -> new Student();
- 格式:Student::new
-
有参数的构造方法引用:(String s)->new Student(s);
- 格式:Student::new
-
注意:需要调用的构造方法中的参数列表要与函数式接口中抽象方法的参数列表保持一致,同时抽象方法的返回值类型为该对象类型
class MyClass{ public MyClass(){ System.out.println("无参数的构造方法..."); } public MyClass(Integer value){ System.out.println("有参数的构造方法...."); } } public class TestMyClass { public static void main(String[] args) { Supplier<MyClass> s3 = MyClass::new; MyClass mc1=s3.get(); Function<Integer,MyClass> s4 = MyClass::new; MyClass mc2=s4.apply(25); } }
-
-