java - 功能接口实现和用例
问题描述
我只是想写一个功能接口来理解不同的用例。
查看我编写的以下代码,我了解到使用 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;
}
}
解决方案
“是否可以在 lambda 表达式中使用默认方法?” 是的。事实上,许多函数式接口都包含默认方法。您需要一个接口中的一个且只有一个抽象方法才能使其成为功能接口,否则 lambda 将不允许存在其他“未实现”的接口方法。但这里是如何应用默认值。下面的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>
and Function<Integer,Integer>
。但是*Operator
扩展假定所有参数的类型相同,因此它们更易于使用(即更少的输入)。
推荐阅读
- c# - 我试图让虚拟对象重叠事件,当它被一些真实对象覆盖时绑定到场景上的真实标记
- ghostscript - 将 PostScript 纸张尺寸转换为 a4 并移动页面图像
- python - Python获取远程文件大小对于多个url来说太慢了
- c - 在c中动态读取文件时分配未知字符[]
- sql - 如何在bigquery中合并两个查询
- google-api - 使用 Gmail API 或 Mail Audit API(或其他 API)监控发件人的附件(仅名称)?
- pytorch - 使用检测器 CUDAERROR 时:没有可在设备上执行的内核映像
- go - go mod tidy go: 更新 go.mod: 打开 C:\Users\WELCOME\go\pkg\mod\github.com\xxxx\go.mod: 访问被拒绝
- sql - 在多个联接中使用同一个表
- android - Snackbar 通过片段导航重叠浮动操作按钮