我有一个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}}标准?
答案 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;
}
});
它不会从您的方法返回(实际上它也不会编译)。