2017-03-31 16 views
1

からMapを作成しようとしています。Streamを使用しています。Java 8ストリーム:マップされた値でマップするリスト

key

valueは、いくつかの派生データでなければならない、元のアイテムの名前でなければなりません。

.map()後ストリームはInteger秒で構成され、.collect()の時に私は、以前のlambdaから「foo」をアクセスすることはできません。元のアイテムは.toMap()でどうやって入手できますか?

これはStreamで行うことができますか?.forEach()が必要ですか?

(以下のコードはデモンストレーション用ですが、実際のコードははるかに複雑で、doSomething()の方法はFooにできません)。

import java.util.ArrayList; 
import java.util.Map; 
import java.util.function.Function; 
import java.util.stream.Collectors; 

public class StreamTest { 

    public class Foo { 
     public String getName() { 
      return "FOO"; 
     } 

     public Integer getValue() { 
      return 42; 
     } 
    } 

    public Integer doSomething(Foo foo) { 
     return foo.getValue() + 23; 
    } 

    public Map<String, Integer> run() { 
     return new ArrayList<Foo>().stream().map(foo -> doSomething(foo)).collect(Collectors.toMap(foo.getName, Function.identity())); 
    } 

    public static void main(String[] args) { 
     StreamTest streamTest = new StreamTest(); 
     streamTest.run(); 
    } 
} 

答えて

3

それはそれほど複雑ではないようです。何か不足していますか?

return Stream.of(new Foo()) 
      .collect(Collectors.toMap(Foo::getName, this::doSomething)); 

私はむしろメソッド参照の方です。あなたが->表記を好む場合は、あなたのストリームに同じ名前を持つ複数のFooがあるかどうどちらかが壊れる

return Stream.of(new Foo()) 
      .collect(Collectors.toMap(foo -> foo.getName(), foo -> doSomething(foo))); 

は(例外をスロー)を使用します。

+0

ああ私が見るので、変換は.map()ではなくコレクション段階で行われますか? – lilalinux

+0

私はそれが唯一の選択肢であるかどうかはわかりませんが、この場合はコレクタ内部のマッピングを行うのが最も簡単な解決策であると確信しています。 @lilalinux –

+1

なぜ 'new Foo()'が配列になっているのか理解するのに数秒かかりました。 1つの要素ストリームが必要な場合は、読者を混乱させることなく 'Stream.of(new Foo()) 'を使うことができます... – Holger

関連する問題