java - Java 8 中的函数类级别参数
问题描述
我想更加努力地使用 Java 8 的功能特性,并将我的思想转向那个范式;但是,我不太确定如何调和这种情况。
例如,我最近写了类似的东西:
public class ExampleClass {
private ExampleData exampleData;
private Function<ExampleData, Boolean> workFunction;
public ExampleData getExampeData() {
return exampleData;
}
public void setExampleData(ExampleData exampleData) {
this.exampleData = exampleData;
}
public Function<ExampleData, Boolean> getWorkFunction() {
return workFunction;
}
public void setWorkFunction(Function<ExampleData, Boolean> workFunction) {
this.workFunction = workFunction;
}
}
然后我继续像这样使用它......
public class Worker implements Callable {
private final ExampleClass exampleClass;
// ExampleClass serves as a container for the function and it's
// input data in order to minimize the number of arguments
// passed to this constructor. Otherwise would be
// public Worker(ExampleData exampleData, Function<T, R> workFunction, ...) {
// Note: using "..." here to represent more args.
public Worker(ExampleClass exampleClass, ...) {
this.exampleClass = exampleClass;
...
}
@Override
public void call() {
final Boolean isComplete = exampleClass.getWorkFunction().apply(exampleClass.getExampleData());
if (isComplete) {
...
}
...
}
}
与我认为更传统的方法相比,上述方法是否更受欢迎?
public class ExampleClass {
private ExampleData exampleData;
public ExampleClass(ExampleData exampleData) {
this.exampleData = exampleData;
}
public Boolean work() {
return isComplete(exampleData);
}
}
和实现类...
public class Worker implements Callable {
private ExampleClass exampleClass;
public Worker(ExampleClass exampleClass, ...) {
this.exampleClass = exampleClass;
...
}
@Override
public void call() {
final Boolean isComplete = exampleClass.work();
if (isComplete) {
...
}
...
}
}
如果我完全偏离了基础,那么使用 Java 8 的适当功能解决方案是什么?
更新:假设我的示例不返回布尔值。在使用 Java 8 进行函数式编程的上下文中,将函数作为类级别参数显式传递更好,还是仅使用传统的面向对象方式传递另一个执行该函数的类更好?
解决方案
函数式编程的要点是函数必须被视为一个对象。
但是你知道,函数(方法)不是java中的对象。它与 javascript 不同。
所以,我们应该使用名为 Predicate 的接口。
List<Apple> apples = new ArrayList<>();
你想得到重量苹果。起初,
List<Apple> weightApples = new ArrayList<>();
for(int i = 0; 9< apples.size(); i++){
if(apples.getWeight() > 10){
weightApples.add(apples.get(i));
}
}
这段代码。
在函数式编程中,函数是“纯函数”。
在纯函数中,应避免在函数中使用外部变量。
而且,我们不关心“使用函数的行”中的函数逻辑
首先,我们需要谓词接口。
interface Predicate<T>{
public boolean pass(T t);
}
通过泛型,我们可以扩展对象类型。
我们可以制作过滤器。
public static <T> List<T> filter(List<T> list, Predicate<T> predicate){
List<T> result = new ArrayList<>();
for(T el : list){
if(predicate.pass(el)){
result.add(el);
}
}
return result;
}
pass() 尚未实现。
它可以由匿名类实现。
最后,使用 lamda 将方法视为对象!
filter(apples, (Apple apple) -> apple.getWeight()>10);
我不是英语的人,所以英语很差。
但我希望它对你有帮助!谢谢。
推荐阅读
- angular - Angular 6 Dev express 模块找不到名称“未知”
- r - Purr 的最佳功能是有条件地选择某些列并将某些功能应用于其内容
- oracle - Oracle ORA_DBA 组禁用
- java - Java双向链表删除方法
- unity3d - Unity 编辑器和项目设置和首选项变成粉红色?
- python - Python - 如何将三个数组和输出组合为一个 json 文件
- javascript - 在主 Safari 浏览器而不是 WebView 中打开链接 - PWA (iOS)
- jqgrid - Free-jqGrid:根据自定义选择的操作数动态设置搜索输入
- sql - 如何在 PL/SQL 中并行获取所有行。我想在 csv 中为 ETL 导出 1 亿行
- java - 如何将自定义工具栏放在片段中?