2013-10-08 142 views
44

我試圖想出了下面的「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())); 

看來,我應該能夠爲嵌入式它使用lambda表達式,但我不能拿出一個編譯。 (我對lambda非常陌生,所以這並不令人意外。)

謝謝。

- >更新:

作爲公認的答案指出

Person::getLast 

就是我一直在尋找,而且是我試過。但是,Eclipse 4.3的夜晚版本是BETA_8的問題 - 它標記爲錯誤。從命令行編譯(我在發佈之前應該完成的),它工作。所以,時候用eclipse.org提交一個bug。

謝謝。

+1

注意也Collectors.toMap一個靜態導入將使表達時間更短,NetBeans的似乎並沒有被導入這些對我來說,雖然不過。 –

回答

117

您可以使用lambda

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

,取而代之的Function.identity ,您可以簡單地使用等效的拉姆達:

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

I如果你使用Netbeans,只要匿名類可以被lambda替換,就應該得到提示。

+1

您可以通過刪除括號來使表達式更短,因爲它們不需要單個參數,即'Collectors.toMap(Person :: getLast,p - > p)'。 –

+1

我也很確定身份函數的類型參數不是必需的,因爲它可以被推斷出來。 'Collectors.toMap(Person :: getLast,Function.identity())' – GuiSim

+0

@GuiSim我認爲現在的情況確實如此 - 它是早期版本的Java 8中的一個錯誤。 – assylias

19
List<Person> roster = ...; 

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

這將是翻譯,但我沒有運行這個或使用的API。最有可能的是你可以用p - > p來代替Function.identity()。使用::

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

,或者更簡潔,你可以使用一個method reference:和靜態導入toMap(...)

4

如果發生相同的鍵衝突,我們也可以使用可選的合併函數。 例如,如果兩個或多個人擁有相同的getLast()值,我們可以指定如何合併這些值。如果我們不這樣做,我們可能會得到IllegalStateException。 這裏是實現這一目標的例子......

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

對不起,但是這是什麼意思? '(person1,person2) - > person1 +「;」+ person2)' –

+0

如果映射鍵包含重複項(根據Object。equals(Object)),將值映射函數應用於每個相等元素,並使用提供的合併函數合併結果。請參考鏈接https://docs.oracle.com/javase/8/docs/api/java/util/stream/Collectors.html#toMap-java.util.function.Function-java.util.function.Function -java.util.function.BinaryOperator- – KayV