Dharmvir Tiwariさん:
私は、java 8ストリームでの作業とforEachの端末操作でオブジェクトの内容を変更しようとしています。
私はここに直面しています問題は、私は変更することが可能だということであるList<Employee>
オブジェクトの内容をが、の内容を変更することはできませんList<Integer>
次のようにコードスニペットは、次のとおりです。
public static void streamExample() {
List<Employee> listEmp = Arrays.asList(new Employee());
listEmp.stream().forEach(a -> a.setEmptName("John Doe"));
listEmp.stream().forEach(System.out::println);
List<Integer> listInteger = Arrays.asList(2, 4, 6, 8, 12,17, 1234);
listInteger.stream().filter(v -> v % 2 == 0).forEach(a -> a=a+1);
listInteger.stream().forEach(System.out::println);
}
私は変更が原因で実行しながら、Integerオブジェクトをボックス化解除のリストに戻って反映されていない疑問に思ってa=a+1
ではなく、必ず運転を。
oleg.cherednik:
あなたは、最適なアプローチを使用していませんStream
。各ステップの思いStream
の変更が存在するとして(または新規作成)要素をバックにそれを返しますStream
。最後に、受信final
結果を、あなたはのいずれかを使用することができfinal
ファイナライズする方法を(そして実際に全体の流れ作業を実行します)Stream
:
List<Integer> listInteger = Arrays.asList(2, 4, 6, 8, 12, 17, 1234);
listInteger.stream().filter(v -> v % 2 == 0).forEach(a -> a = a + 1);
listInteger.stream().forEach(System.out::println);
ここでは、初期の配列を持っています。あなたは、次の操作を実行します:
- いくつかの要素(これはないフィルタリング
final
ステップ)。 - (これはフィルタ要素をプリントアウト
final
ステップ)。
そのためには、あなたが作成する必要はありませんStreams
2回。使用のいずれかを実行します。
Stream.of(2, 4, 6, 8, 12, 17, 1234) // create stream (there're many way to do it)
.filter(v -> v % 2 == 0) // filter out required elements
.map(v -> v + 1) // transform elements using given rule
.forEach(System.out::println); // finalize stream with printing out each element separately
注: Stream.of(...)
作成しStream
、その後、我々はストリームに2つのステップを追加filter
し、map
その後、及びfinalize
またはSTARTがでストリームを作成しましたforEach
。