如何使用Java的removeIf()方法移除满足两个条件的元素?
问题分析与解决方案
嘿,我一下子就发现你代码里的问题啦!你的Predicate逻辑存在矛盾,这才导致removeIf()没能按预期工作。
错误原因
你写的条件是:
Predicate<Student> condition = p->p.grade=='C'&& p.grade=='B';
一个学生的成绩不可能同时既是'C'又是'B',这个条件永远会返回false,所以removeIf()根本不会移除任何元素。
正确实现
你需要移除的是**成绩低于'B'**的学生(也就是成绩为'C'及更差的等级),我们可以利用Java中字符按ASCII码比较的特性:'A' < 'B' < 'C' < 'D' < 'F',所以低于'B'的等级其ASCII值会大于'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("--------------"); // 正确条件:移除成绩低于'B'的学生(成绩为'C'及以下) Predicate<Student> condition = p -> p.grade > 'B'; // 如果你的等级只有A/B/C,也可以直接写:p -> p.grade == 'C' students.removeIf(condition); // 验证结果:此时students中应该只有Davut、Ali、Ivan System.out.println(students);
额外提醒
如果你的Student类中grade字段是private的,记得要提供对应的getGrade()方法,然后把条件改成:
Predicate<Student> condition = p -> p.getGrade() > 'B';
这样就能完美实现移除成绩低于'B'的学生的需求啦!
内容的提问来源于stack exchange,提问作者YULIANG WANG
相关产品推荐
相关产品推荐

