Java 8嵌套流-转换链式循环

时间:2018-11-01 08:25:27

标签: java for-loop java-8 java-stream

我目前正在使用Java 8功能。

我有以下代码,并尝试了多种使用for (CheckBox checkBox : checkBoxList) { for (String buttonFunction : buttonFunctionsList) { if (checkBox.getId().equals(buttonFunction)) { associatedCheckBoxList.add(checkBox); } } } 的方法,但没有成功。

checkBoxList.forEach(checkBox -> {
     buttonFunctionsList.forEach(buttonFunction -> {
     if (checkBox.getId().equals(buttonFunction))
     associatedCheckBoxList.add(checkBox);
     });
     });

我尝试了以下操作,但是我不确定这是否正确:

Debug JS Remotely

谢谢!

2 个答案:

答案 0 :(得分:2)

伊兰的答案可能还不错;但由于buttonFunctionList(可能是一个列表),因此它可能包含重复的元素,这意味着原始代码会多次将复选框添加到关联的列表中。

因此,这是另一种方法:将复选框添加到列表的次数与另一个列表中该项目ID的出现次数相同。

这样,您可以将内部循环编写为:

int n = Collections.frequency(buttonFunctionList, checkBox.getId();
associatedCheckboxList.addAll(Collections.nCopies(checkBox, n);

因此,您可以将其写为:

List<CheckBox> associatedCheckBoxList =
    checkBoxList.flatMap(cb -> nCopies(cb, frequency(buttonFunctionList, cb.getId())).stream())
        .collect(toList());

(为简洁起见,使用静态导入)

如果checkBoxListbuttonFunctionList很大,则您可能需要考虑一次计算频率:

Map<String, Long> frequencies = buttonFunctionList.stream().collect(groupingBy(k -> k, counting());

然后,您可以在lambda中使用它作为n的{​​{1}}参数:

nCopies

答案 1 :(得分:1)

当您的目标是产生某些输出collect时,您应该更喜欢forEach而不是Collection

List<CheckBox> associatedCheckBoxList =
    checkBoxList.stream()
                .filter(cb -> buttonFunctionsList.stream().anyMatch(bf -> cb.getId().equals(bf)))
                .collect(Collectors.toList());