使用Java8流验证列表

时间:2016-09-07 22:53:35

标签: java java-8

假设我有List<Foo>个对象,User内有Foo个对象:

public class Foo {
   public User user;
}

public class User {
   int id;
   int typeId;
}

假设我有一个接受User对象和List对象的方法。如果任何Foo对象的User与传入方法的用户不同,Java8中是否有一种有效的方式来流式传输Foo对象并快速返回?

public boolean validate(User loggedInUser, List<Foo> objectsToVerify);

我的想法是:

return objectsToVerify.stream().filter(o -> o.user != loggedInUser).collect(Collections.toList()).isEmpty();

3 个答案:

答案 0 :(得分:1)

return objectsToVerify.stream().allMatch(o -> o.user.equals(loggedInUser));

应该是你所追求的。 可能会将equals()hashCode()添加到User

或者如果你想使用方法参考

return objectsToVerify.stream().map(Foo::getUser).allMatch(loggedInUser::equals);

答案 1 :(得分:0)

是的,这对于流来说很简单。假设存在Foo.getUserFoo.equals,则:

return !objectsToVerify.stream()
    .map(Foo::getUser)
    .allMatch(loggedInUser::equals);

你提到过#fast;&#39;。这将在第一次不匹配时返回true。如果您的列表真的很大,那么您可以使流并行,以便可以在多个线程中搜索它。但除非有数百万个对象要验证,否则这对整体性能不太重要。

答案 2 :(得分:0)

这可以解决你的问题:

return !objectsToVerify.parallelStream()
            .anyMatch(o -> !o.user.equals(loggedInUser));