2017-05-03 7 views
2

Ich möchte Index erhalten, wenn die Traverseliste Lambda verwendet.Wie bekomme ich den Element-Index, wenn ich einen Stream verwende, um eine Liste zu durchlaufen?

Zum Beispiel:

List<CheckBox> checkBoxes = null; 

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

EDIT: Die checkBoxes = null; ist nur ein Platzhalter, sondern wird richtig verwendet werden, sobald ich einige Codes schreiben beginnen.

+1

Dieser Code wie würde würde eine "Null-Zeiger-Ausnahme" vollständig werfen – 3kings

+1

Lambda funktioniert nicht in allen Fällen, aber mit einer traditionellen 'for' Schleife wäre am besten für Ihren Fall. –

+0

Ich weiß. Es ist nur ein Beispiel. Ich werde nicht so in meinem Code schreiben. – Cyrus

Antwort

5

Hier ist, wie ich es tun würde.

Führen Sie einen IntStream über die Indizes der Liste. Dann Filter die Indizes basierend darauf, ob das entsprechende Kontrollkästchen ausgewählt ist. Dann Karte der Indexwert, ein int, in eine String Darstellung des Indexwerts. Abschließend sammeln Sie die Zeichenfolgen in einer Ergebniszeichenfolge getrennt durch Kommas.

Code:

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

Der Ausgang wird so etwas wie

0,1,3,6 

sein, abhängig von dem Kontrollkästchen tatsächlich geprüft werden.

Ich würde vermeiden, forEach zu verwenden, da Sie das Ziel erreichen können, indem Sie Werte umwandeln, anstatt Nebenwirkungen auszuführen. Ich würde auch vermeiden, List.indexOf, da das sucht die Liste linear für das gewünschte Element. Es ist keine große Sache, wenn Sie nur ein paar Checkboxen haben, aber wenn Sie viel haben, wird das O (N^2) Wachstum die Leistung leiden leiden.

+0

Ihre Antwort ist sehr wertvoll für mich, aber was mich Kopfschmerzen macht ist, dass es API 24 benötigt. – Cyrus

1

versuchen

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

die Sie interessieren, mit 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

Bitte halten Sie Ihr Lambda kurz und mögen Sie vielleicht einen Liner vielleicht –

1

Lambda nicht Arbeit für alle Fälle würde ich für Schleife eine traditionelle Verwendung empfehlen.

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

Wenn Sie jedoch auf mit Hilfe von Streams bestehen müssen Sie die indexOf Methode durch die List bereitgestellt verwenden, um den entsprechenden Index für das jeweilige Element zu erhalten.

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