如何将 2 个 forEach 循环转换为功能代码?
How to convert 2 forEach loops into functional code?
如何将下面嵌套的forEach循环转换成函数式代码?
ABC abc = new ABC();
for (A a : aList) {
for (String b : bList) {
if (Objects.equals(a.getName(), b)) {
abc.setId(a.getId());
abc.setValue(a.getValue());
}
}
}
我尝试过这样转换,但没有成功:
aList.forEach(a -> {
bList.stream()
.filter(b -> Objects.equals(b, a.getName()));
abc.setId(a.getId());
abc.setValue(a.getValue());
});
你可以试试
aList.forEach(a -> {
if( bList.stream()
.anyMatch(b -> Objects.equals(b, a.getName()))){
abc.setId(a.getId());
abc.setValue(a.getValue());
}
});
或更好
aList.stream().filter(a -> bList.stream()
.anyMatch(b -> Objects.equals(b,a.getName())))
.findAny()
.ifPresent(a -> {
abc.setId(a.getId());
abc.setValue(a.getValue());
});
不确定什么是“功能代码”以及为什么这里需要它。
我的方法,假设 bList
是 List<String>
:
var abc = aList
.stream()
.filter(this::isKnownName)
.map(this::abcFromA)
.findFirst() // see ¹ bellow
.orElseGet(ABC::new);
使用下面的帮助器 函数 - 不是真的需要,我们可以使用 lambda 表达式,但我认为使用它更具可读性 ²:
private boolean isKnownName(A a) {
return bList.contains(a.getName());
}
private ABC abcFromA(A a) {
var result = new ABC();
result.setId(a.getId());
result.setValue(a.getValue());
return result;
}
¹ 此代码使用在 bList
中找到的第一个匹配项,有问题的代码使用最后一个匹配项
² 我会在完全使用此解决方案和使用单个循环(使用 bList.contains()
而不是问题中发布的内部循环)之间挣扎。
如何将下面嵌套的forEach循环转换成函数式代码?
ABC abc = new ABC();
for (A a : aList) {
for (String b : bList) {
if (Objects.equals(a.getName(), b)) {
abc.setId(a.getId());
abc.setValue(a.getValue());
}
}
}
我尝试过这样转换,但没有成功:
aList.forEach(a -> {
bList.stream()
.filter(b -> Objects.equals(b, a.getName()));
abc.setId(a.getId());
abc.setValue(a.getValue());
});
你可以试试
aList.forEach(a -> {
if( bList.stream()
.anyMatch(b -> Objects.equals(b, a.getName()))){
abc.setId(a.getId());
abc.setValue(a.getValue());
}
});
或更好
aList.stream().filter(a -> bList.stream()
.anyMatch(b -> Objects.equals(b,a.getName())))
.findAny()
.ifPresent(a -> {
abc.setId(a.getId());
abc.setValue(a.getValue());
});
不确定什么是“功能代码”以及为什么这里需要它。
我的方法,假设 bList
是 List<String>
:
var abc = aList
.stream()
.filter(this::isKnownName)
.map(this::abcFromA)
.findFirst() // see ¹ bellow
.orElseGet(ABC::new);
使用下面的帮助器 函数 - 不是真的需要,我们可以使用 lambda 表达式,但我认为使用它更具可读性 ²:
private boolean isKnownName(A a) {
return bList.contains(a.getName());
}
private ABC abcFromA(A a) {
var result = new ABC();
result.setId(a.getId());
result.setValue(a.getValue());
return result;
}
¹ 此代码使用在 bList
中找到的第一个匹配项,有问题的代码使用最后一个匹配项
² 我会在完全使用此解决方案和使用单个循环(使用 bList.contains()
而不是问题中发布的内部循环)之间挣扎。