如何将 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());
               });

不确定什么是“功能代码”以及为什么这里需要它。
我的方法,假设 bListList<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() 而不是问题中发布的内部循环)之间挣扎。