For循环到Java 8 Stream forEach()

时间:2018-04-07 20:11:12

标签: java java-8

我有一个for循环用于检查数据库中是否存在索引值的列表。

如果没有任何值存在,它会立即返回false。

public boolean exists(List<String> keys) {
     for(String key: keys) {
         boolean exists = service.existsByKey(key);
         if(!exists) return false;
      }
        return true;
}

我尝试将其更改为java 8 foreach,但它没有按预期工作。

keys.stream().forEach(k -> {
    boolean exists = service.existsByKey(k);
    if(!exists) return false;
});

我错过了什么吗?为什么不进入if(!exists)的{​​{1}}标准?

3 个答案:

答案 0 :(得分:5)

forEach方法中的return语句将被忽略。

尝试使用

boolean exists = key.stream().allMatch(k -> service.existsByKey(k));

答案 1 :(得分:1)

你不能使用forEach构造返回一个值,因为它接受一个使用者,即一个接受一个参数并且不返回任何内容的函数(void),而是可以使用allMatch作为在另一个答案或noneMatch中显示如下:

return keys.stream()
           .noneMatch(key -> !service.existsByKey(key))

答案 2 :(得分:0)

您使用的lambda主要是匿名类的快捷方式。 所以你的代码相当于:

    keys.stream().forEach(new Consumer<String>() {
        @Override
        public void accept(String s) {
            boolean exists = service.existsByKey(k);
            if(!exists) return false;
        }
    });

它不会从您的方法返回(实际上它也不会编译)。