85

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 にバグを報告しましょう。

ありがとう。

4

3 に答える 3

199

ラムダを使用できます:

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

または、より簡潔に言うと、以下を使用してメソッド参照を使用でき::ます。

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

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

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

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

于 2013-10-08T20:34:37.930 に答える
30
List<Person> roster = ...;

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

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

于 2013-10-08T19:41:04.187 に答える