Преобразование foreach в поток фильтра Java 8 - PullRequest
0 голосов
/ 07 мая 2018

У меня есть следующий код

Map<String, List<String>> map= new HashMap<>();
map.put("a", Arrays.asList("a1"));
map.put("b", Arrays.asList("a2"));

List<String> result = new ArrayList<>();

List<String> list = new ArrayList<>();
list.add("a");
list.add("c");

for (String names : list) {
    if (!map.containsKey(names)) {
          result.add(names);
    }
}

И я попытался перенести его на Java 8. Что я делаю не так?

list.stream()
    .filter(c -> !map.containsKey(Name))
    .forEach(c -> result.add(c));

Но мое состояние не оценивается

Ответы [ 4 ]

0 голосов
/ 07 мая 2018
  • Name не определено нигде в области. Имя лямбда-параметра c. Вы должны использовать это.
  • collect(Collectors.toList()) следует использовать, чтобы удалить явное объявление и сделать его более выразительным.

List<String> result = 
        list.stream()
            .filter(c -> !map.containsKey(c))
            .collect(Collectors.toList());
0 голосов
/ 07 мая 2018

Прежде всего, должно быть:

list.stream()
    .filter(c-> !map.containsKey(c))
    .forEach(c->result.add(c));

Во-вторых, лучше использовать collect в качестве терминала Stream, когда вы хотите произвести List:

List<String> result = 
    list.stream()
        .filter(c-> !map.containsKey(c))
        .collect(Collectors.toList());
0 голосов
/ 07 мая 2018
list.stream()
    .filter(c -> !map.containsKey(c))
    .collect(Collectors.toCollection(ArrayList::new));
0 голосов
/ 07 мая 2018

должно быть

list.stream().filter(c-> !map.containsKey(c)).forEach(result::add);

Лучший способ:

List<String> result = list.stream().filter(c -> !map.constainsKey(c)).collect(Collectors.toList());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...