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

时间:2017-05-03 03:53:55

标签: java android lambda 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(",");
      }
});

编辑checkBoxes = null;只是一个占位符,但在我开始编写代码后会正常使用。

4 个答案:

答案 0 :(得分:8)

这是我将如何做到的。

对列表的索引运行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)增长会导致性能下降。

答案 1 :(得分:2)

尝试使用IntStream

List<CheckBox> checkBoxes = //data

IntStream.range(0, checkBoxes.size())
.forEach(i -> {
   CheckBox checkbox = checkBoxes.get(i); 
    if(checkbox.isSelected()){
        sb.append(i);
        sb.append(",");
    }
});

答案 2 :(得分:1)

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

答案 3 :(得分:1)

lambda 适用于所有情况,我建议使用传统的for循环。

for(int i = 0; i < checkBoxes.size(); i++){
    if(checkBoxes.get(i).isSelected()){
         // simply use "i" in this case for the index
         sb.append(i); //I want to get checkbox index here
         sb.append(",");
     }
}

但是,如果您坚持使用流,则需要使用indexOf提供的List方法来获取该特定元素的相应索引。

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