如何使用 removeIf() 删除 2 个条件?

How to use removeIf() to remove 2 conditions?

我想使用 removeIf 删除 2 个条件,但我没有找到正确的方法。

例如,我想删除成绩低于“B”的学生

代码如下:

Student[] group1 = {new Student(), new Student(), new Student(), new Student()};

group1[0].setInfo("Davut", 'M', 123, 'A');
group1[1].setInfo("Ali", 'M', 43, 'B');
group1[2].setInfo("Ivan", 'M', 34, 'B');
group1[3].setInfo("Lily", 'F', 67, 'C');

System.out.println(Arrays.toString(group1));

ArrayList<Student> students = new ArrayList<>();
students.addAll(Arrays.asList(group1));
System.out.println("--------------");
Predicate<Student> condition = p->p.grade=='C'&& p.grade=='B';
students.removeIf(condition);

这一行有问题:

Predicate<Student> condition = p->p.grade=='C'&& p.grade=='B';

您要求删除成绩为 'C' AND 'B' 的学生。应该是 'C' OR 'B'.

替换为:

Predicate<Student> condition = p->p.grade=='C' || p.grade=='B';
Predicate<Student> condition = p->p.grade=='C'&& p.grade=='B';
students.removeIf(condition);

应该是

Predicate<Student> condition = p->p.grade=='C'|| p.grade=='B';
students.removeIf(condition);

一个学生的成绩不可能同时是B和C,所以你提供的谓词永远不会为真。

此外,可以使用 and()or() 方法将两个谓词链接在一起,如下所示:

Predicate<Student> condition = p->p.grade=='C'
Predicate<Student> condition2 = p->p.grade=='B';
students.removeIf(condition.or(condition2);
// students.removeIf(condition.and(condition2); works similarly but with logical and

https://howtodoinjava.com/java8/predicates-logical-operations/

您也可以尝试这样做:

Predicate<Student> condition = p-> ((int) p.grade) > 65;

'A' ASCII 中的字符是 65,所以 A 之后的任何字母,如 B - 66,C - 67,D - 68 都更高。

但是这样做并不是特别安全。因为如果您将“@”作为等级字符传递怎么办……

我很可能会介绍一个带等级的枚举。 在枚举中引入一个方法 isLessThenA() 在方法中,我将检查值是否为 ssome 枚举类型,如果不是,将抛出异常。

其他答案正确。或者,为什么不只调用两次 removeIf()?

students.removeIf(p->p.grade=='C');
students.removeIf(p->p.grade=='B');

我觉得读起来很清楚,你和你的 reader 都不需要考虑它应该是 && 还是 ||