【问题标题】:Java 8 nested streams - convert chained for loopsJava 8 嵌套流 - 转换链式 for 循环
【发布时间】:2019-04-05 10:56:41
【问题描述】:

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

我有以下一段代码,并尝试了多种使用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);
     });
     });

谢谢!

【问题讨论】:

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


    【解决方案1】:

    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());
    

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

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

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

    然后你可以在 lambda 中使用它作为nCopiesn 参数:

    (int) frequencies.getOrDefault(cb.getId(), 0L)
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 尚不清楚buttonFunctionsList 是否包含重复项:如果包含,则此方法未添加。
      • @AndyTurner 我认为将相同的CheckBox 多次添加到输出List 是没有意义的。我可能是错的。
      • 确实,很可能没有重复,或者如果有,它们不是有意的。只是指出不一样。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-14
      • 2022-01-19
      • 1970-01-01
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多