2017-01-18 5 views
4

だが、私は任意の値を返さずに、単にオブジェクトに変換を行うvoidメソッドを持っている、と私はこのように、ストリームマップ()関数のコンテキストでそれを使用したいとしましょう:ストリームマッピングのJavaメソッドのvoidメソッド?

public List<MyObject> getList(){ 
    List<MyObject> objList = ... 
    return objList.stream().map(e -> transform(e, e.getUuid())).collect(Collectors.toList()); 
} 

private void transform(MyObject obj, String value){ 
    obj.setUuid("prefix" + value); 
} 

例は単純化のために作られています。実際の方法は、オブジェクトのUUIDを取り除く以外の何かをしています。

とにかく、上記のようなシナリオでvoidメソッドを使用する方法はありますか? 確かに、私はメソッドが変換されたオブジェクトを返すようにすることができますが、それはポイントの外にあり、デザインに違反しています(メソッドは無効にする必要があります)。あなたは、これはあなたが何をしたいかであることが確実な場合

答えて

10

は、Java 8ストリームの強制使用方法の場合である。このように思えるのぞく代わりにマップのを使用しています。代わりにforEachでそれを達成することができます。

List<MyObject> objList = ... 
objList.forEach(e -> transform(e, e.getUuid())); 
return objList; 
3

、その後、

+1

これは、peekの設計がデバッグの目的であるため、適切な方法ではありません。 https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html#peek-java.util.function.Consumer- – Cupitor

4

Eugene's answerに加えて、あなたは、このようなStream::mapを使用することができます。

objList.stream().map(e -> {transform(e, e.getUuid()); return e;}).collect(Collectors.toList()); 

は実際にあなたが新しいListにあなたの現在の要素を変換し、それを収集する必要はありません。代わりに、Listの各エントリにメソッドを適用する必要があります。したがって、Collection::forEachを使用し、Listを返す必要があります。

List<MyObject> objList = ...; 
objList.forEach(e -> transform(e, e.getUuid())); 
return objList; 
関連する問題