2 回答

TA贡献1828条经验 获得超4个赞
Eran 的回答可能不错;但由于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());
(为简洁起见,使用静态导入)
如果任一checkBoxList或者buttonFunctionList是大的,你可能要考虑计算频率一次:
Map<String, Long> frequencies = buttonFunctionList.stream().collect(groupingBy(k -> k, counting());
然后你可以在 lambda 中使用 this 作为n参数nCopies:
(int) frequencies.getOrDefault(cb.getId(), 0L)

TA贡献1845条经验 获得超8个赞
你应该更喜欢collect
在forEach
当你的目标是要产生一些输出Collection
:
List<CheckBox> associatedCheckBoxList = checkBoxList.stream() .filter(cb -> buttonFunctionsList.stream().anyMatch(bf -> cb.getId().equals(bf))) .collect(Collectors.toList());
添加回答
举报