【发布时间】:2019-10-13 10:32:44
【问题描述】:
我正在尝试转换为 Lambda 函数
到目前为止,我能够将上面的代码转换为如下所示的 lambda 函数
Stream.of(acceptedDetails, rejectedDetails)
.filter(list -> !isNull(list) && list.length > 0)
.forEach(new Consumer<Object>() {
public void accept(Object acceptedOrRejected) {
String id;
if(acceptedOrRejected instanceof EmployeeValidationAccepted) {
id = ((EmployeeValidationAccepted) acceptedOrRejected).getId();
} else {
id = ((EmployeeValidationRejected) acceptedOrRejected).getAd().getId();
}
if(acceptedOrRejected instanceof EmployeeValidationAccepted) {
dates1.add(new Integer(id.split("something")[1]));
Integer empId = Integer.valueOf(id.split("something")[2]);
empIds1.add(empId);
} else {
dates2.add(new Integer(id.split("something")[1]));
Integer empId = Integer.valueOf(id.split("something")[2]);
empIds2.add(empId);
}
}
});
但我的目标仍然是避免重复相同的逻辑并转换为 Lambda 函数,仍然在我转换的 lambda 函数中我觉得它不干净和高效。
这只是为了我的学习方面,我通过一个现有的代码 sn-p 来做这些事情。
谁能告诉我如何即兴转换转换后的 Lambda 函数
【问题讨论】:
-
这是一个相当大的例子,下面的代码会检查命令式没有的 instanceof,你的目标到底是什么?对我来说,使用 instanceof 似乎很糟糕
-
如果您的应用程序的这一部分对性能不敏感(就像真的很敏感),我会为
empIdAccepted做一个stream.map() 等,为dateAccepted做一个等等更清晰,并将您显示的逻辑分成彼此不相关的不同方面。这是函数式编程的基础:分解成子操作或步骤 -
我的目标是在不重复任何代码或逻辑的情况下转换为 lambda 函数
-
函数式编程部分是关于一种更细粒度的方法,在这种方法中,您将工作分块/划分为多个步骤 - 当您停止实现自己完成所有事情的函数时,重复代码和/或步骤是给定的(例如空值检查 + 转换而不是一件事)
-
在您的
filter步骤中,流元素似乎是数组(您正在访问list.length),然后,在forEach步骤中,它们突然应该是EmployeeValidationAccepted的实例或EmployeeValidationRejected。这是行不通的。用这个不完整的损坏代码替换您的工作原始代码也没有建设性。在原始代码中,您有dateRejected和empIdRejected,但现在您有dates1、dates2、empIds1和empIds2,它们都没有声明。
标签: java lambda java-8 functional-programming functional-interface