Java8自带函数式接口
1、主要的四大内置函数式接口(上一篇已经讲过函数式接口的特点,所以以下列出了接口名称以及对应的抽象方法名称)
接口名称 | 方法名称 | 方法特点 | 备注 |
---|---|---|---|
Consumer<T> | void accept(T t) | 有入参,无返回值 | 消费型接口 |
Supplier<T> | T get() | 无入参,有返回值 | 供给型接口 |
Function<T, R> | R apply(T t) | T类型入参,R类型出参,T和R可以相同 | 函数型接口 |
Predicate<T> | boolean test(T t) | 有入参,返回boolean类型 | 断言型接口 |
2、具体实战示例
2.1 Consumer<T>
public class ConsumerDemo {
public static void print(User user) {
System.out.println(user);
}
public static void showUser(User user, Consumer<User> consumer) {
consumer.accept(user);
}
public static void main(String[] args) {
showUser(new User(1001,"张三"),x -> print(x));
}
}
分析:在showUser方法中使用了Consumer接口,Consumer接口有一个accpet方法需要实现,具体特点是有入参,无返回值。
入参就是new User(1001,"张三"),aceept的具体实现就是print方法。
2.2 Supplier<T>
public class SupplierDemo {
public static User createUser() {
return new User(1001,"张三");
}
public static User showUser(Supplier<User> supplier) {
return supplier.get();
}
public static void main(String[] args) {
User user = showUser(SupplierDemo::createUser);
//相当于User user = showUser(() -> createUser());
System.out.println(user);
}
}
分析:同理,这次需要一个没有入参,有返回值的方法,也就是createUser();
2.3 Function<T, R>
public class FunctionDemo {
public static User changeUser(User user,Function<User,User> function) {
return function.apply(user);
}
public static User createSpecialUser(User user) {
user.setId(999);
user.setName("特殊");
return user;
}
public static void main(String[] args) {
User user = changeUser(new User(1001, "张三"), x -> createSpecialUser(x));
System.out.println(user);
}
}
2.4 Predicate<T>
public class PredicateDemo {
public static Boolean testCompare(Integer i,Predicate<Integer> predicate) {
return predicate.test(i);
}
public static void main(String[] args) {
Boolean flag = testCompare(100, x -> (x < 101));
System.out.println(flag);
}
}
3、总结使用技巧
看了上面的代码示例,能发现这几个自带的函数式接口都是有共性的。如果当某个方法的具体入参是一个上述的函数式接口,那么你需要传入的入参实际上就是一个lambda表达式类似:x-> f(x)、x->f()、f()、f(x)等等,这个要看你使用了哪个接口。
还有Java8还有一些其他的函数式接口,可以自己去了解:http://www.runoob.com/java/java8-functional-interfaces.html