Java 函数式接口
函数式接口
Functional Interface 就是一个有且只有一个抽象方法,但是可以有多个非抽象方法的接口。
- 函数式接口可以被隐式的转换为lambda表达式
- 不能使用以下类型方法来声明一个函数式接口:默认方法(default)、静态方法、从Object类继承的方法
函数式接口格式
@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);
}
常用函数式接口
Supplier 接口
@FunctionalInterface
public interface Supplier<T> {
  /**
   * 编译器自动给方法加上 public abstract
   * 产生一个 T 类型数据
   */
  T get();
}
Consumer 接口
@FunctionalInterface
public interface Consumer<T> {
  /**
   * 与 Supplier相反,Consumer消费一个 T 类型数据
   */
  void accept(T t);
}
Predicate 接口
@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);
  }
}
Function 接口
@FunctionalInterface
public interface Function<T, R> {
  /**
   * 根据 T 类型数据,得到 R 类型数据
   */
  R apply(T t);
}
参考文章
[1] Java 8 函数式接口
[2] 详解Java 8 函数式接口

 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号