如何在使用流遍历列表时获取元素索引?

Cyr*_*rus 2 java lambda android java-8 java-stream

我想在遍历列表使用lambda时得到索引.

例如:

List<CheckBox> checkBoxes = null;

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

编辑:这checkBoxes = null;只是一个占位符,但一旦我开始编写代码就会正常使用.

Stu*_*rks 8

我就是这样做的.

运行IntStream列表的索引.然后根据是否选中相应的复选框过滤索引.然后将索引值a 映射到索引值intString表示中.最后,将字符串收集到结果字符串中,以逗号分隔.

码:

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

输出将是类似的

    0,1,3,6
Run Code Online (Sandbox Code Playgroud)

取决于实际检查的复选框.

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