方法引用
@Test
public void test01() {
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.forEach(System.out :: println);
}
使用情境:
当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!
本质
本质上就是Lambda表达式,而Lambda表达式作为函数式接口的实例。所以方法引用,也是函数式接口的实例。
使用格式:
类(或对象) :: 方法名
具体分为如下的三种情况:
情况1
- 对象 :: 非静态方法
情况2
- 类 :: 静态方法
情况3
- 类 :: 非静态方法
方法引用使用的要求
- 要求接口中的抽象方法的形参列表和返回值类型与方法引用的方法的
- 形参列表和返回值类型相同!(针对于情况1和情况2)
案例
// 情况一:对象 :: 实例方法
//Consumer中的void accept(T t)
//PrintStream中的void println(T t)
@Test
public void test1() {
Consumer<String> con1 = str -> System.out.println(str);
con1.accept("北京");
System.out.println("*******************");
PrintStream ps = System.out;
Consumer<String> con2 = ps::println;
con2.accept("beijing");
}
//Supplier中的T get()
//Employee中的String getName()
@Test
public void test2() {
Employee emp = new Employee(1001,"Tom",23,5600);
Supplier<String> sup1 = () -> emp.getName();
System.out.println(sup1.get());
System.out.println("*******************");
Supplier<String> sup2 = emp::getName;
System.out.println(sup2.get());
}
import org.apache.http.HttpHost;
import java.util.Arrays;
public class mytest {
public static void main(String[] args) {
String nodes = "192.168.1.96:9200,192.168.1.97:9200,192.168.1.98:9200";
HttpHost[] httpHosts = Arrays.stream(nodes.split(",")).map(x -> {
String[] hostInfo = x.split(":");
return new HttpHost(hostInfo[0], Integer.parseInt(hostInfo[1]));
}).toArray(HttpHost[]::new);
System.out.println(Arrays.toString(httpHosts));
}
}