Java重温学习笔记,Java8新特性:方法引用

方法引用通过方法的名字来指向一个方法,它可以使语言的构造更紧凑简洁,减少冗余代码。方法引用使用一对冒号 :: 。

一、方法引用可以做什么?看如下代码:

import java.util.*;
import java.util.stream.Collectors;
 
public class MyDemo {
    public static void main(String[] args) {
        List<String> strList = Arrays.asList(new String[] { "a", "c", "b" });

        strList.stream().sorted((s1, s2) -> s1.compareToIgnoreCase(s2)).forEach(s -> System.out.println(s));
    }
}

采用方法引用后,可以简化为如下:

import java.util.*;
import java.util.stream.Collectors;
 
public class MyDemo {
    public static void main(String[] args) {
        List<String> strList = Arrays.asList(new String[] { "a", "c", "b" });

        strList.stream().sorted(String::compareToIgnoreCase).forEach(System.out::println);
    }
}

二、方法引用有四种形式

  • 静态方法引用       :   ClassName :: staticMethodName
  • 构造器引用        :   ClassName :: new
  • 类的任意对象的实例方法引用:   ClassName :: instanceMethodName
  • 特定对象的实例方法引用  :   object :: instanceMethodName

1. 静态方法引用

System.out::println 等价于Lambda表达式 s -> System.out.println(s) ,代码示例:

import java.util.*;
import java.util.stream.Collectors;
 
public class MyDemo {
    public static void main(String[] args) {
        //lambda表达式使用:
        Arrays.asList(new String[] {"a", "c", "b"}).stream().forEach(s -> MyDemo.println(s));
        //静态方法引用:
        Arrays.asList(new String[] {"a", "c", "b"}).stream().forEach(MyDemo::println);
    }
    
    public static void println(String s) {
        System.out.println(s);
    }
}

2. 构造器引用

() -> new ArrayList<String>() 等价于 ArrayList<String>::new,代码示例:

Supplier<List<String>> supplier1= () -> new  ArrayList<String>();

等价于

Supplier<List<String>> supplier = ArrayList<String>::new;

3. 类的任意对象的实例方法引用

  Arrays.sort(strs,(s1,s2)->s1.compareToIgnoreCase(s2));

等价于

Arrays.sort(strs, String::compareToIgnoreCase);

4. 特定对象的实例方法引用

import java.util.*;
import java.util.stream.Collectors;
 
public class MyDemo {
    public static void main(String[] args) {
        MyDemo test = new MyDemo();
        // lambda表达式使用:
        Arrays.asList(new String[] {"a", "c", "b"}).stream().forEach(s -> test.println(s));
        // 特定对象的实例方法引用:
        Arrays.asList(new String[] {"a", "c", "b"}).stream().forEach(test::println);
    }
    
    public void println(String s) {
        System.out.println(s);
    }
}

三、总结

方法引用代替Lambda表达式对代码的简化程度,远远没有Lambda表达式代替匿名类的简化程度大, 有时反而增加了代码的理解难度。
为了增强可读性,没有必要刻意使用方法引用。

本文参考:

https://www.jianshu.com/p/62465b26818f

https://www.runoob.com/java/java8-method-references.html

原文地址:https://www.cnblogs.com/nayitian/p/14951879.html