Удалить нулевые объекты из списка объектов Student

Я изучал функцию 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 27.05.2019 21:46

Спасибо @GhostCat. Я согласен, но на тот случай, если придет нуль, код должен обработать это, я хотел изучить функцию Java 8, чтобы удалить нуль, а не использовать старый стиль до Java 8. Спасибо

ronan 27.05.2019 21:47
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
2
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

removeIf(Objects::isNull) удаляет любой Student объект в данном списке, который является null, а не каждый студент, который name является null. Вы можете достичь того, чего хотите с .removeIf(student -> student.getName() == null)

Просто любопытно узнать, почему ls.removeAll(Collections.singleton(null)); тоже не работал

ronan 27.05.2019 21:50
removeIf ожидает Predicate<Student, что означает, что он ожидает функцию, которая для данного студента возвращает true или false. removeAll получает данный Collection<Student> и удаляет все Student объекты, которые соответствуют любому объекту в предоставленной коллекции (в вашем случае Collections.singleton(null)). Но нет null ученика, есть только ученики с nullname
roookeee 27.05.2019 21:52

Другие вопросы по теме