美文网首页
Java8 方法引用

Java8 方法引用

作者: Tinyspot | 来源:发表于2022-08-17 07:55 被阅读0次

1. 方法引用

  • 操作符 ::(即“把这个方法作为值”)
  • Lambda 表达式是匿名内部类的简化写法,方法引用是 Lambda 表达式的简化写法
  • 如果一个 Lambda 代表的只是“直接调用这个方法”,那最好还是用名称来调用它,而不是去描述如何调用它

2. 常见形式

  • 对象::实例方法
  • 类::静态方法
  • 类::实例方法
  • 类::new

重点:某个方法签名和接口结构恰好一致

::提取的函数,最主要的区别在于静态与非静态方法,非静态方法比静态方法多一个参数,就是被调用的实例

public static void main(String[] args) {
    // BiFunction<String, Integer, String> biFunction1 = (String str, Integer i) -> str.substring(i);
    BiFunction<String, Integer, String> biFunction2 = (str, i) -> str.substring(i);
    BiFunction<String, Integer, String> biFunction3 = String::substring;

    // String : String substring(int beginIndex)
    String content = "Hello JDK8";

    // 对象::实例方法  Function<T, R> : R apply(T t);
    Function<Integer, String> function = content::substring;
    String result = function.apply(1);

    // 类::实例方法  BiFunction<T, U, R> : R apply(T t, U u);
    BiFunction<String, Integer, String> biFunction = String::substring;
    result = biFunction.apply(content, 1);
}

2.1 对象::实例方法

  Consumer<String> consumer = str -> System.out.println(str);

  // void println(String x) 与 void accept(T t); 结构一样
  PrintStream out = System.out; // 实例
  Consumer<String> method1 = out::println;
        
  Consumer<String> method2 = System.out::println;
  method1.accept("hello");
  Person person = new Person("tinyspot");
  Supplier<String> supplier = () -> person.getName();
  Supplier<String> method = person::getName;
  String name = method.get();

2.2 类::静态方法

  // Comparator<T> : int compare(T o1, T o2);
  // Integer : static int compare(int x, int y)
  Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
  Comparator<Integer> method = Integer::compare;

2.3 类::实例方法

若Lambda 的参数列表的第一个参数,是实例方法的调用者,第二个参数(或无参)是实例方法的参数时,格式: 类::实例方法

  // person 作为参数, person.getName()中 person 也是方法的调用者
  Function<Person, String> function = person -> person.getName();
  Function<Person, String> method = Person::getName;
  String apply = method.apply(new Person("tinyspot"));
  System.out.println(apply);
  BiPredicate<String, String> bp1 = (o1, o2) -> o1.equals(o2);
  BiPredicate<String, String> bp2 = String::equals;

3. 构造器引用(类::new)

public static void main(String[] args) {
    Supplier<Person> supplier = () -> new Person();
    Supplier<Person> method = Person::new;
    Person person = method.get();
}

4. 数组引用

Function<Integer, String[]> function = length -> new String[length];
Function<Integer, String[]> method = String[] :: new;
String[] strs = method.apply(10);

5. 其他

List<String> strings = Arrays.asList("222","111");
strings.sort((s1, s2) -> s1.compareToIgnoreCase(s2));
strings.sort(String::compareToIgnoreCase);
// or
Comparator<String> comparator = (String s1, String s2) -> s1.compareToIgnoreCase(s2);
strings.sort(comparator);

相关文章

网友评论

      本文标题:Java8 方法引用

      本文链接:https://www.haomeiwen.com/subject/ascyyrtx.html