Как отсортировать в стриме по двум полям с учетом null

184
27 марта 2018, 00:45

Здравствуйте. У меня есть лист таких объектов.

class Obj {
   Integer property1;
   Object property2;
}

Мне нужно отсортировать их в стриме. Мне нужно, отсортировать по property1 в первую очередь, затем в thenComparing() добавить условие, чтобы сперва шли те обьекты, у которых property2 == null.

То есть вот сортировка по property1:

List<Obj> sortedList = list.stream()
                .sorted(Comparator.comparing(Obj::property1))
                .collect(Collectors.toList());

У меня не получается cделать добавочную сортировку, я вроде делаю простые вещи, но идея ругается, что non static method cannot be referenced from static context

Помогите пожалуйста с сортировкой.

Answer 1

Можно так.

Comparator<Obj> comparator1 = Comparator.comparing(Obj::getProperty1);
Comparator<Obj> comparator2 = comparator1.thenComparing((o1, o2) -> (o2.property2 == null) ? 1 : 0 + (o1.property2 == null ? -1 : 0));
list.stream().sorted(comparator2)...

Про ошибку non static method cannot be referenced from static context - в каком месте она возникает?

Answer 2

Можно так:

List<Obj> result =
        List.<Obj>of(new Obj(), new Obj(), new Obj())
            .stream()
            .sorted(Comparator.comparing(Obj::getProperty1)
                   .thenComparing(
                      Comparator.nullsFirst(Comparator.comparing(Obj::getProperty2))))
            .collect(Collectors.toList());
READ ALSO
перебор элементов объекта с помощью jQuery $.each

перебор элементов объекта с помощью jQuery $.each

Необходимо получить данные из filename, raw_url и languageJS начал изучать вчера, нужна критика

222
Не срабатывает таймаут в функции [дубликат]

Не срабатывает таймаут в функции [дубликат]

На данный вопрос уже ответили:

225