2017-05-03 139 views
2

我想索引时,导线列表的使用拉姆达。如何使用流遍历列表时获取元素索引?

例如:

List<CheckBox> checkBoxes = null; 

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

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

+1

这代码是将完全抛出一个'空指针Exception' – 3kings

+1

拉姆达为所有的情况下不工作,但使用传统的'for'循环将是最适合你的情况。 –

+0

我知道。这只是一个例子。我不会在我的代码中这样写。 – Cyrus

回答

5

下面是我该怎么做。

运行一个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)的增长会导致性能下降。

+0

你的回答有很大的价值给我,但什么让我头疼的是它需要的API 24。 – Cyrus

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(","); 
    } 
}); 
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(","); 
    } 
}); 
+0

请保持您的拉姆达短,像一个班轮也许 –

1

拉姆达确实为所有的情况下不的工作,我会建议使用传统的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(","); 
    } 
} 

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

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