首页 > 解决方案 > 功能接口实现和用例

问题描述

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

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

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

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

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;
    }

}

标签: javajava-8functional-programmingfunctional-interface

解决方案


“是否可以在 lambda 表达式中使用默认方法?” 是的。事实上,许多函数式接口都包含默认方法。您需要一个接口中的一个且只有一个抽象方法才能使其成为功能接口,否则 lambda 将不允许存在其他“未实现”的接口方法。但这里是如何应用默认值。下面的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>and Function<Integer,Integer>。但是*Operator扩展假定所有参数的类型相同,因此它们更易于使用(即更少的输入)。


推荐阅读