文章目录
1. 方法引用简介
概念
方法引用是lambda表达式的一种简化写法。
简化前提
如果lambda表达式的方法体中只调用了一个方法,并且调用的方法和函数式接口中定义的抽象方法的参数列表和返回值都一致,就可以使用方法引用进行简化。
常见形式
- 对象::实例方法
- 类::静态方法
- 类::实例方法
- 类::new
2. 方法引用的使用
package com.ali;
import javax.swing.*;
import java.util.Comparator;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Supplier;
/**
* 方法引用的四种使用方式:
* 1. 对象::实例方法
* 2. 类::静态方法
* 3. 类::实例方法
* 4. 类::new
*/
public class Test {
public static void main(String[] args) {
//1.对象::实例方法
m1();
//2.类::静态方法
m2();
//3.类::实例方法
m3();
//4.类::new
m4();
}
//1.对象::实例方法
public static void m1() {
//1. 对象名::实例方法
//void accept(T t);
//void println(String x);
//println方法和accept方法都是有参数无返回值,可以用方法引用简化lambda的书写
//1.1 接口 变量名 = 匿名内部类
Consumer<String> consumer = new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
};
consumer.accept("consumer1");
//1.2 接口 变量名 = lambda表达式
consumer = s -> {
System.out.println(s);
};
consumer.accept("consumer2");
//1.3 接口 变量名 = 方法引用
consumer = System.out::println;
consumer.accept("consumer3");
System.out.println("============================================");
}
//2.类名::静态方法
public static void m2() {
//public static int compare(int x, int y) 有参数有返回
//int compare(T o1, T o2); 有参数有返回
//匿名内部类写法
Comparator<Integer> comparator = new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return Integer.compare(o1, o2);
}
};
System.out.println("comparator.compare(10,20) = " + comparator.compare(10, 20));
//用lambda表达式简化
comparator = (o1, o2) -> {
return Integer.compare(o1, o2);
};
System.out.println("comparator.compare(10,20) = " + comparator.compare(10, 20));
//用方法引用简化
comparator = Integer::compare;
System.out.println("comparator.compare(10,20) = " + comparator.compare(10, 20));
System.out.println("============================================");
}
//3.类::实例方法
public static void m3() {
//public String getName(); 无参数有返回值
//R apply(T t); 有参数有返回值
//比较特殊
Person person = new Person("张三");
//匿名内部类写法
Function<Person, String> function = new Function<Person, String>() {
@Override
public String apply(Person person) {
return person.getName();
}
};
System.out.println(function.apply(person));
//用lambda表达式简化
function = p -> p.getName();
System.out.println(function.apply(person));
//用方法引用简化
function = Person::getName;
System.out.println(function.apply(person));
System.out.println("============================================");
}
//4.类::new
public static void m4() {
//匿名内部类写法
// new String(); 空参构造,返回对象
//T get();
Supplier<String> supplier = new Supplier<String>() {
@Override
public String get() {
return new String("abc");
}
};
System.out.println(supplier.get());
//用lambda表达式简化
supplier = () -> new String("abc");
System.out.println(supplier.get());
//用方法引用简化
supplier = String::new;
System.out.println(supplier.get());
System.out.println("============================================");
}
}
class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return this.name;
}
}