2014-10-02 2 views
11

У меня есть Set<String> usernames и List<Player> playersJava 8 Lambda - коллекция фильтров другой коллекции

Я хотел бы, чтобы отфильтровать тех игроков, которые не в наборе.

Я знаю, как сделать это в Vanilla предварительно Java 8

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

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

Я пытаюсь написать этот простой код с лямбда-выражения, но я изо всех сил, чтобы получить usernames.contains() работать в фильтре

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

Это не скомпилировано. «Не удается resove метод GetUserName()»

ответ

24

Вы получили лямбда-выражение в неправильном месте - весь аргумент filter должен быть лямбда-выражение. Другими словами: «Учитывая игрока p, следует ли его фильтровать или нет?»

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

Bullocks! Я знал, что я пропустил что-то простое. Благодаря! #feelsAshamed –

+0

Ницца! спасибо! –

+0

Привет, я использую сценарий excact, но он показывает ошибку компиляции. Локальная переменная «имена пользователей», определяемая в охватывающей области, должна быть окончательной или эффективной окончательной » –

Смежные вопросы