2014-10-02 61 views
11

我有一個Set<String> usernamesList<Player> players的Java 8拉姆達 - 過濾器收集的另一個集合

我想過濾掉那些沒有設置玩家。

我知道如何在香草前的Java 8

List<Player> distinctPlayers = new ArrayList<Player>(); 

for(Player p : players) { 
    if(!usernames.contains(p.getUsername()) distinctPlayers.add(p); 
} 

我試圖寫一個Lambda表達式這個簡單的代碼做到這一點,但我努力讓usernames.contains()在過濾器工作

players.stream().filter(!usernames.contains(p -> p.getUsername())) 
.collect(Collectors.toList()); 

這不會編譯。 「」無法移動方法getUsername()「

回答

24

您已將lambda表達式放在錯誤的位置 - filter的整個參數應該是lambda表達式。換句話說,「給定玩家p,我應該過濾還是不過濾?」

players.stream().filter(p -> !usernames.contains(p.getUsername())) 
+2

Bull!!我知道我錯過了一些簡單的東西。謝謝! #feelsAshamed – 2014-10-02 21:58:03

+0

不錯!謝謝!〜 – 2016-04-25 19:40:41

+0

嗨,我正在使用excact方案,但它顯示編譯錯誤「局部變量」用戶名「在一個封閉範圍內定義必須是最終的或有效的最終」 – 2016-08-31 14:36:52