web-dev-qa-db-ja.com

Collectors.toMap()keyMapper-より簡潔な表現?

次のCollectors.toMap()呼び出しで、「keyMapper」関数パラメーターのより簡潔な式を考えています。

List<Person> roster = ...;

Map<String, Person> map = 
    roster
        .stream()
        .collect(
            Collectors.toMap(
                new Function<Person, String>() { 
                    public String apply(Person p) { return p.getLast(); } 
                },
                Function.<Person>identity()));

ラムダ式を使用してインライン化できるはずですが、コンパイルできるものは思いつきません。 (私はラムダがまったく新しいので、それほど驚くことではありません。)

ありがとう。

->更新:

受け入れられた答えに記されているように

Person::getLast

私が探していたものであり、私が試したものです。ただし、Eclipse 4.3のBETA_8ナイトリービルドが問題でした-それは間違っているとフラグを立てました。コマンドラインからコンパイルすると(投稿前に行う必要がありました)、機能しました。それでは、Eclipse.orgにバグを報告してください。

ありがとう。

68
pfurbacher

ラムダを使用できます:

Collectors.toMap(p -> p.getLast(), Function.identity())

または、より簡潔に、::を使用して method reference を使用できます。

Collectors.toMap(Person::getLast, Function.identity())

また、Function.identityの代わりに、同等のラムダを使用できます。

Collectors.toMap(Person::getLast, p -> p)

Netbeansを使用する場合、匿名クラスをラムダに置き換えることができる場合は常にヒントを取得する必要があります。

172
assylias
List<Person> roster = ...;

Map<String, Person> map = 
    roster
        .stream()
        .collect(
            Collectors.toMap(p -> p.getLast(), p -> p)
        );

それが翻訳になりますが、私はこれを実行したことがないか、APIを使用しました。ほとんどの場合、Function.identity()の代わりにp-> pを使用できます。 toMap(...)を静的にインポートします

26
aepurniet

同じキー衝突の場合にも、オプションのマージ関数を使用できます。たとえば、2人以上の人が同じgetLast()値を持っている場合、値をマージする方法を指定できます。これを行わないと、IllegalStateExceptionが発生する可能性があります。これを実現するための例を次に示します...

Map<String, Person> map = 
roster
    .stream()
    .collect(
        Collectors.toMap(p -> p.getLast(),
                         p -> p,
                         (person1, person2) -> person1+";"+person2)
    );
5
KayV