JAVA8之函数式接口返回实例
一. 概述
上篇说到,函数式接口返回实例有两种种方式,而上篇最后的示例实际上就是第一种返回实例的方式,也是用的最多的最基础的一种方式--lambda表达式创建实例.这里就不再介绍了.着重介绍方法引用返回实例的方式.本章节可能会涉及一些后面将要讲到的知识点,此处重点是展示,后面会仔细讲解.
二. 方法引用返回实例
1. 构造器引用
语法:Class::new
构造器引用一般都会需要用的Supplier这个函数式编程的工具包(java.util.function),他是一个函数式接口.在后面会详细介绍,这一章节先只是使用方便展示.先看下Supplier类:
@FunctionalInterface
public interface Supplier<T> {
/**
* Gets a result.
*
* @return a result
*/
T get();
}
首先创建一个Person类,其中必须有无参构造,不然会报错:
package com.yczuoxin.demo;
import java.util.function.Supplier;
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public Person() {
}
public static Person create(Supplier<Person> sup){
return sup.get();
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void run(){
System.out.println(name + " is running");
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
}
测试创建一个Person类:
package com.yczuoxin.demo;
public class LambdaTest {
public static void main(String[] args) {
Person p1 = Person.create(Person::new);
p1.setName("张三");
System.out.println(p1);
}
}
可见我们使用Person::new 创建了一个Supplier的实例,所以利用构造器引用创建了函数式接口的实例.
2. 对象的方法引用(包括静态方法)
语法:Class::method
先介绍一下Iterable接口下新增的默认方法forEach(),在其中用到了Consumer接口,他与Supplier接口类似,在此不做讲解,在java8中支持了接口中放入默认方法,该方法的定义如下:
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
用方法引用的方法调用系统类的输出方法和Person类的run方法:
package com.yczuoxin.demo;
import java.util.Arrays;
import java.util.List;
public class LambdaTest {
public static void main(String[] args) {
List<Person> list = Arrays.asList(
new Person("张三"),
new Person("李四"),
new Person("王五"),
new Person("赵六"));
list.forEach(System.out::println);
list.forEach(Person::run);
}
}
测试结果:
调用成功.
三. 小结
使用lambda表达式个人觉得最大的是使得代码看起来更简便,可以少写许多代码.最明显的还是上篇最后一个例子,用函数式接口来取代了匿名内部类.少写了几行代码.