2017-05-03 184 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(","); 
    } 
});