将foreach转换为Java 8过滤器流

时间:2018-05-07 11:02:05

标签: java lambda java-8 java-stream

我有以下代码

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 :(得分:4)

首先,它应该是:

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());

答案 1 :(得分:3)

list.stream()
    .filter(c -> !map.containsKey(c))
    .collect(Collectors.toCollection(ArrayList::new));

答案 2 :(得分:2)

应该是

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

更好的方法是:

List<String> result = list.stream().filter(c -> !map.constainsKey(c)).collect(Collectors.toList());

答案 3 :(得分:2)

  • Name未在范围内的任何位置定义。 lambda参数的名称是c。你应该使用它。
  • collect(Collectors.toList())应该用于删除显式声明并使其更具表现力。
List<String> result = 
        list.stream()
            .filter(c -> !map.containsKey(c))
            .collect(Collectors.toList());