在Java中以lambda形式返回谓词



在本在线教程中,他们使用lambda来过滤用户列表:

List<User> olderUsers = users.stream().filter(u -> u.age > 30).collect(Collectors.toList());

现在我想创建一个接受lambda(u -> u.age > 30部分)的函数,这样我就可以在这个lambda中放入我想要的任何条件。但我有点纠结于如何实现这一点。我做了一个空接口Filter,我做了以下方法:

public List<User> filterUsers(Filter f, List<User users>){
    return users.stream().filter(f).collect(Collectors.toList());
}
public Filter olderThan(int age) {
    return u -> u.getAge() > age;
}

但这会产生一些错误。

(我在user中做了一个age字段的getter)。有没有办法调整接口Filter或其他方法来实现这一点?

您不需要Filter类型。只需使filterUsers方法取一个Predicate<User>并将其传入:

public List<User> filterUsers(Predicate<User> p, List<User> users) {
    return users.stream().filter(p).collect(Collectors.toList());
}

这将允许你写一些类似的东西:

List<User> filtered = filterUsers(u -> u.age > 10, users);

如果你想方便地制作你的"旧"东西,你可以写:

public Predicate<User> olderThan(int age) {
    return u -> u.getAge() > age;
}

然后你可以写:

List<User> filtered = filterUser(olderThan(15), users);

您应该简单地使用Predicate而不是Filter

最新更新