如何使用 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 都不需要考虑它应该是 &&
还是 ||
。
我想使用 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 都不需要考虑它应该是 &&
还是 ||
。