1. 程式人生 > 實用技巧 >java8:方法引用

java8:方法引用

方法引用

若 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表示式的基礎上進一步簡化程式碼。