java8:方法引用
阿新 • • 發佈:2020-11-17
若 Lambda 體中的功能,已經有方法提供了實現,可以使用方法引用(可以將方法引用理解為 Lambda 表示式的另外一種表現形式)
物件的引用 :: 例項方法名
基本使用
@Test public void test(){ Consumer<String> consumer=(x)->System.out.println(x); /* println方法是已經有實現的,可以使用方法引用 */ PrintStream printStream1=System.out; Consumer<String> consumer1=(x)->printStream1.println(x); PrintStream printStream=System.out; Consumer<String> consumer2=printStream::println; /* 方法引用的方式適用於Lambda體中的內容已經有方法實現了 */ Consumer<String> consumer3=System.out::println; consumer3.accept("hello"); }
例項
@Test public void test(){ Employee emp = new Employee(20201116, "zhai", 18, 9999.99); Supplier<String> sup = () -> emp.getName(); System.out.println(sup.get()); System.out.println("----------------------------------"); Supplier<String> sup2 = emp::getName; System.out.println(sup2.get()); }
類名::靜態方法名
@Test public void test(){ Comparator<Integer> com = (x, y) -> Integer.compare(x, y); System.out.println(com.compare(12,45)); System.out.println("-------------------------------------"); Comparator<Integer> com2 = Integer::compare; System.out.println(com2.compare(40,40)); }
-1 ------------------------------------- 0
兩個輸入一個輸出的函式式介面
@Test public void test(){ BiFunction<Double, Double, Double> fun = (x, y) -> Math.max(x, y); System.out.println(fun.apply(1.5, 22.2)); System.out.println("--------------------------------------------------"); BiFunction<Double, Double, Double> fun2 = Math::max; System.out.println(fun2.apply(1.2, 1.5)); }
類名::例項方法名
若Lambda 的引數列表的第一個引數,是例項方法的呼叫者,第二個引數(或無參)是例項方法的引數時,格式: ClassName::MethodName
@Test public void test(){ BiPredicate<String, String> bp = (x, y) -> x.equals(y); System.out.println(bp.test("abcde", "abcde")); System.out.println("-----------------------------------------"); BiPredicate<String, String> bp2 = String::equals; System.out.println(bp2.test("abc", "abc")); }
true ----------------------------------------- true
構造器引用
不傳遞引數的時候呼叫的是無參的構造器
@Test public void test(){ Supplier<Employee> sup = () -> new Employee(); System.out.println(sup.get()); System.out.println("------------------------------------"); Supplier<Employee> sup2 = Employee::new; System.out.println(sup2.get()); }
Employee(id=0, name=null, age=0, salary=0.0) ------------------------------------ Employee(id=0, name=null, age=0, salary=0.0)
給構造器傳遞引數
@Test public void test(){ Function<Integer,Employee> function=(s)->new Employee(s); Employee employee1=function.apply(202011); System.out.println(employee1); Function<Integer,Employee> fun2=Employee::new; Employee employee=fun2.apply(202012); System.out.println(employee); }
注意:構造器的引數列表,需要與函式式介面中引數列表保持一致
@Test public void test(){ Function<Integer, String[]> fun = (args) -> new String[args]; String[] strs = fun.apply(10); System.out.println(strs.length); System.out.println("--------------------------"); Function<Integer, Employee[]> fun2 = Employee[] :: new; Employee[] emps = fun2.apply(20); System.out.println(emps.length); }
運用匿名內部類可以省略掉介面的實現類的書寫,Lambda表示式可以對匿名內部類進一步簡化,方法引用和Lambda表示式的結合使用能夠進一步簡化程式碼,但是簡化的程度沒有Lambda表示式對匿名內部類簡化程度大。好處就是能夠在Lambda表示式的基礎上進一步簡化程式碼。