功能接口实现和用例

Functional Interface Implementations and use cases

我只是想写一个功能接口来理解不同的用例。

查看我编写的以下代码,我了解到我可以使用 lambda 表达式进行不同的实现。除此之外,任何人都可以展示复杂的实现吗?

是否可以在 lambda 表达式中使用其他默认方法,即 addLikeOtherWay?如果是的话,在我的例子中如何?

为什么我只有一个抽象方法的接口?在我的接口中只有一个抽象方法的用例是什么?

public class Calculator {

    public static void main(String[] args) {
        ICalculator i = (int a, int b) -> a + b;
        System.out.println(i.add(5, 2));
        i = (int a, int b) -> a + b + a;
        System.out.println(i.add(5, 2));
    }
}

@FunctionalInterface
interface ICalculator {

    public int add(int a, int b);

    default int addLikeThis(int a, int b) {
        return a + b;
    }

    default int addLikeOtherWay(int a, int b) {
        return a + b + a + b;
    }

}

"Is it possible to use the default method in a lambda expression?" 是的。事实上,许多函数式接口都包含默认方法。一个接口中只需要一个抽象方法就可以成为一个功能接口,否则 lambda 将有其他接口方法 "unimplemented",这是不允许的。但这里是如何应用默认值的。下面的 BiFunction 界面是从 API 来源中提取的,没有 JavaDoc.

以下代码有效,因为 BinaryOperatorUnaryOperator 分别扩展了 BiFunctionFunction

      BinaryOperator<Integer> add = (numb1,numb2)->numb1+numb2;
      UnaryOperator<Integer> mul = resultFromAdd->resultFromAdd*20;
      BinaryOperator<Integer> addThenMul = (numb1,numb2) ->add.andThen(mul).apply(numb1,numb2);
      int result = addThenMul.apply(10,20); // produces (10+20)*20 = 600

以下是从 Java API 源文件中提取的。

       @FunctionalInterface
       public interface BiFunction<T, U, R> {

          R apply(T t, U u);

          default <V> BiFunction<T, U, V> andThen(
                Function<? super R, ? extends V> after) {
             Objects.requireNonNull(after);
             return (T t, U u) -> after.apply(apply(t, u));
          }
       }

在上面的示例代码中,我可以使用 BiFunction<Integer,Integer,Integer>Function<Integer,Integer>。但是 *Operator 扩展假定所有参数的类型相同,因此它们更易于使用(即更少输入)。

Why would I have interface with only one abstract method? What would be the use case of having only single abstract method in my interface?

为了方便使用 lambda 表达式,它们是无名函数。 Lambda 表达式使代码富有表现力并减少混乱。它还使代码更具可读性。这是基于我使用 lambda 表达式的经验。