java - List.removeIf() 的谓词行为

标签 java stream predicate

我有一个包含姓名和年龄成员变量的人员类。我有如下 2 个谓词方法。

    static Predicate<Person> isAbove20(){
        return p -> p.getAge() > 20;
    }

    static Predicate<Person> isNameEqualTo(String name){
        return p -> p.getName().equals(name);
    }

我有一个人员列表和几行代码,如下所示。

    List<Person> people = new ArrayList<>();
    people.add(new Person("raj", 20));
    people.add(new Person("bini", 15));
    people.add(new Person("tom", 25));
    people.add(new Person("rock", 12));

    print(people);
    people.removeIf(Predicates.isNameEqualTo("rock").and(Predicates.isAbove20()));
    System.out.println("**** after applying predicates ****");
    print(people);

运行此代码时,我得到的输出为

Person{name='raj', age=20}
Person{name='bini', age=15}
Person{name='tom', age=25}
Person{name='rock', age=12}
**** after applying predicates ****
Person{name='raj', age=20}
Person{name='bini', age=15}
Person{name='tom', age=25}
Person{name='rock', age=12}

我期望它从列表中删除 2 个 Person 对象。 rock(名称为“rock”)和tom(年龄超过20岁))将列表内容打印为

Person{name='raj', age=20}
Person{name='bini', age=15}

有人可以解释一下为什么它在创建时打印整个列表。

谢谢。

最佳答案

您将“和”与“或”混淆了。如果某个人的名字是 rock 年龄 > 20,则您的谓词会删除此人。

没有人匹配此谓词。

关于java - List.removeIf() 的谓词行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43846779/

相关文章:

java - 如何为 JTextPane 设置默认背景色

java - 将日期前 12 天显示为当前日期

javascript - 在页面上显示视频流 block (node.js)

linq - PredicateBuilder无法转换为IQueryable吗?

java - Java11中的谓词过滤所有元素

Java:组合多个谓词

Java StringBuilder 类,为什么多了 16 个空元素?

vb.net - 如何将流写入文件?

javascript - 解析json数组流

java - Jackson ReadValue 不会转换为 List<>