Functional Interface 就是一个有且只有一个抽象方法,但是可以有多个非抽象方法的接口。
@FunctionalInterface public interface MyInterface { public void method(String s); } // 使用 lambda 表达式实现该接口 MyInterface myInterface = (s) -> System.out.println(s); // 上面的过程相当于 MyInterface myInterface = new MyInterface() { @Override public void method(String s) { // TODO Auto-generated method stub System.out.println(s); } };
使用Lambda表达式作为参数传递
public class RunnableExample { private static void start(Runnable task) { new Thread(task).start(); } public static void main(String[] args) { start(() -> System.out.println("Execute thread.")) } }
使用Lambda表达式作为返回值
public class LambdaReturnExample { public Comparator<String> comparator() { return (o1, o2) -> o2.length() - o1.length(); } // 上面的lambda等价于 public Comparator<String> comparator() { return new Comparator<String>() { @Override public int compare(String o1, String o2) { return o2.length() - o1.length(); } } } }
使用类型参数与函数式接口创建通用函数式接口。
@FunctionalInterface public interface Comparator<T> { int compare(T o1, T o2); }
@FunctionalInterface public interface Supplier<T> { /** * 编译器自动给方法加上 public abstract * 产生一个 T 类型数据 */ T get(); }
@FunctionalInterface public interface Consumer<T> { /** * 与 Supplier相反,Consumer消费一个 T 类型数据 */ void accept(T t); }
@FunctionalInterface public interface Predicate<T> { /** * 根据给定参数计算布尔值 */ boolean test(T t); // 逻辑与 default Predicate<T> and(Predicate<? super T> other) { Objects.requireNonNull(other); return (t) -> test(t) && other.test(t); } // 逻辑非 default Predicate<T> negate() { return (t) -> !test(t); } // 逻辑或 default Predicate<T> or(Predicate<? super T> other) { Objects.requireNonNull(other); return (t) -> test(t) || other.test(t); } // 返回 Predicate,可以判断两个参数是否相等 static <T> Predicate<T> isEqual(Object targetRef) { return (null == targetRef) ? Objects::isNull : object -> targetRef.equals(object); } }
@FunctionalInterface public interface Function<T, R> { /** * 根据 T 类型数据,得到 R 类型数据 */ R apply(T t); }
参考文章
[1] Java 8 函数式接口
[2] 详解Java 8 函数式接口