我想在遍历列表使用lambda时获取索引。

例如:

List<CheckBox> checkBoxes = null;

checkBoxes.forEach(checkBox -> {
      if (checkBox.isSelected()) {
          sb.append("index"); //I want to get checkbox index here
          sb.append(",");
      }
});

编辑:checkBoxes = null;只是一个占位符,但是一旦我开始编写一些代码,就可以正确使用。

最佳答案

这就是我的做法。

在列表的索引上运行IntStream。然后根据是否选中相应的复选框来过滤索引。然后将索引值int映射到索引值的String表示形式。最后,将字符串收集到结果字符串中,并用逗号分隔。

码:

    String result = IntStream.range(0, checkBoxes.size())
                             .filter(i -> checkBoxes.get(i).isSelected())
                             .mapToObj(String::valueOf)
                             .collect(Collectors.joining(","));

输出将类似于
    0,1,3,6

取决于实际选中的复选框。

我会避免使用forEach,因为您可以通过转换值而不是执行副作用来实现目标。我也避免使用List.indexOf,因为那样会在列表中线性搜索所需的项目。如果只有几个复选框,这没什么大不了,但是如果有很多复选框,O(N ^ 2)的增长将导致性能下降。

09-11 16:13
查看更多