2017-05-03 6 views
2

トラバースリストがラムダを使うときにインデックスを取得したい。例えばストリームを使用してリストをトラバースするときの要素インデックスの取得方法

List<CheckBox> checkBoxes = null; 

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

EDITcheckBoxes = null;は単なるプレースホルダですが、私はいくつかのコードを書き始めると、適切に使用されます。

+1

そのコードは完全に 'ヌルポインタ例外 'を投げるでしょう – 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

IntStreamを使用して、これを試してみてください

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

を試してみてください。

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本のライナーが好きかもしれません –

1

ラムダは、すべてのケースのためではない作業を行い、私はループのための伝統的なを使用することをお勧めします。

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(","); 
    } 
}); 
関連する問題