1. ホーム
  2. java

[解決済み] Collectors.toMap() keyMapper -- より簡潔な表現?

2022-03-07 05:54:36

質問

以下の関数パラメータについて、より簡潔な表現を考えています。 Collectors.toMap() を呼び出します。

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にバグを報告する時が来た。

ありがとうございます。

解決方法は?

ラムダを使えばいいんです。

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

または、もっと簡潔に言うと メソッドリファレンス を使って :: :

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

の代わりに Function.identity というように、単純に同等のラムダを使用することができます。

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

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