Я изучал функцию Java 8 для удаления нулевых объектов из списка, например, объектов Student, и у меня есть следующий код
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
public class Student {
private String name;
public Student(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student {" + "name = " + name + "}";
}
public static Comparator<Student> getNameComparator() {
return (s1, s2) -> s1.name.compareTo(s2.name);
// return Comparator.comparing(x -> x.name,
// Comparator.nullsLast(Comparator.naturalOrder()));
}
public static void main(String[] args) {
List<Student> ls = new ArrayList<>(
Arrays.asList(new Student("Dino"), new Student(null), new Student("Fred"), new Student("Amy")));
// ls.removeAll(Collections.singleton(null));
ls.removeIf(Objects::isNull);
ls.forEach(s -> System.out.println(s));
System.out.println("...............................");
ls.sort(Student.getNameComparator());
ls.forEach(s -> System.out.println(s));
}
}
Я использовал специфичный для Java 8 isNull, т.е. ls.removeIf(Objects::isNull);
все еще в o/p я вижу нулевое значение
то есть
О/п
Student {name=Dino} Student {name=null} Student {name=Fred} Student {name=Amy}
Я пропустил что-то конкретное?
Спасибо Ронан
Спасибо @GhostCat. Я согласен, но на тот случай, если придет нуль, код должен обработать это, я хотел изучить функцию Java 8, чтобы удалить нуль, а не использовать старый стиль до Java 8. Спасибо
removeIf(Objects::isNull)
удаляет любой Student
объект в данном списке, который является null
, а не каждый студент, который name
является null
. Вы можете достичь того, чего хотите с .removeIf(student -> student.getName() == null)
Просто любопытно узнать, почему ls.removeAll(Collections.singleton(null)); тоже не работал
removeIf
ожидает Predicate<Student
, что означает, что он ожидает функцию, которая для данного студента возвращает true или false. removeAll
получает данный Collection<Student>
и удаляет все Student
объекты, которые соответствуют любому объекту в предоставленной коллекции (в вашем случае Collections.singleton(null)
). Но нет null
ученика, есть только ученики с null
name
Просто для протокола: гораздо более разумным подходом было бы: А) не допускать нулевых студентов и Б) студентов с нулевыми именами в первую очередь ;-)