功能接口实现和用例
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.
以下代码有效,因为 BinaryOperator
和 UnaryOperator
分别扩展了 BiFunction
和 Function
。
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 表达式的经验。
我只是想写一个功能接口来理解不同的用例。
查看我编写的以下代码,我了解到我可以使用 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.
以下代码有效,因为 BinaryOperator
和 UnaryOperator
分别扩展了 BiFunction
和 Function
。
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 表达式的经验。