为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

噜噜哒 2021-12-22 18:53:18
我目前正在玩 Java 8 features 。我有以下一段代码,并尝试了多种使用Streams 的方法,但没有成功。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);     });     });
查看完整描述

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)


查看完整回答
反对 回复 2021-12-22
?
精慕HU

TA贡献1845条经验 获得超8个赞

你应该更喜欢collectforEach当你的目标是要产生一些输出Collection

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


查看完整回答
反对 回复 2021-12-22
  • 2 回答
  • 0 关注
  • 151 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号