For循环到Java8流forEach()

For循环到Java8流forEach(),java,java-8,Java,Java 8,我有一个for循环,用于检查db中是否存在索引值 简单地说,如果任何值不存在,它将立即返回false public boolean exists(List<String> keys) { for(String key: keys) { boolean exists = service.existsByKey(key); if(!exists) return false; } return true; } 我错

我有一个for循环,用于检查db中是否存在索引值

简单地说,如果任何值不存在,它将立即返回false

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

我错过什么了吗?如果(!exists)statement在
forEach()
中,它为什么不进入

forEach方法中的返回语句被忽略

尝试使用

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

您不能使用
forEach
结构返回值,因为它接受一个消费者,即接受一个参数但不返回任何内容的函数(
void
),相反,您可以使用
allMatch
,如另一个答案所示,或者像这样使用
noneMatch

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

您可以使用lambda,它主要是匿名类的快捷方式。 因此,您的代码相当于:

    keys.stream().forEach(new Consumer<String>() {
        @Override
        public void accept(String s) {
            boolean exists = service.existsByKey(k);
            if(!exists) return false;
        }
    });
keys.stream().forEach(新消费者(){
@凌驾
公共无效接受(字符串s){
boolean exists=service.existsByKey(k);
如果(!exists)返回false;
}
});

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

更好的是:
key.stream().allMatch(service::existsByKey)@JacobG。同意,但对于一个从函数编程和流开始的人来说,可读性不是很好。@contracost我认为尽早从方法引用开始是好的。我发现lambdas如
k->service.existsByKey(k)
可读性差得多。@lexicore没有单一的答案。可读性在这里是非常个人化的。对我来说,带参数的传统方法调用比带方法引用的方法参数的删除可读性强得多。在我看来,方法引用很像语法糖。你可以在非常有限的情况下使用它。我试着向作者展示他想做什么以及为什么不起作用。
    keys.stream().forEach(new Consumer<String>() {
        @Override
        public void accept(String s) {
            boolean exists = service.existsByKey(k);
            if(!exists) return false;
        }
    });