Игнорировать нулевые значения при сортировке в лямбде - PullRequest
1 голос
/ 29 марта 2020

Я пытался игнорировать нулевые значения, когда сортировал значения, если значения 0 0 4 2 1 7, это должно быть первым 1 2 4 7 0 0

List<PersonItem> collect = personLists.stream()
.sorted((p1,p2) -> 
    (p1.getCelebrityWeighting() == null ? 0 : p1.getCelebrityWeighting()) 
     - (p2.getCelebrityWeighting() == null ? 0 : p2.getCelebrityWeighting()))
.collect(Collectors.toList());

1 Ответ

0 голосов
/ 30 марта 2020

Сортировка с последними null значениями :

Обратите внимание, что значения 0 будут первыми. Это null дружественный.

personLists.sort(
    Comparator.comparing(
        PersonItem::getCelebrityWeighting,                 // key extractor, comparing by...
        Comparator.nullsLast(Comparator.naturalOrder()))); // natural order, nulls last

0, 0, 1, 2, 4, 7, ноль, ноль


Сортировка со значениями 0 в прошлом :

Обратите внимание, что это решение не null, getCelebrityWeighting() не должно быть null и работает, если все значения null заменены на 0 , Запомните порядок в компараторе при возврате 1 or -1`.

personLists.sort((first, second) -> {
    if (first.getCelebrityWeighting() == 0) return 1;                       // 0 last
    if (second.getCelebrityWeighting() == 0) return -1;                     // 0 last
    return first.getCelebrityWeighting() - second.getCelebrityWeighting();  // standard
});

1, 2, 4, 7, 0, 0, 0, 0


Сортировка с последними значениями 0 и null :

Комбинация приведенных выше примеров null дружественная:

personLists.sort(
    Comparator.comparing(
        PersonItem::getCelebrityWeighting,         // key extractor, comparing by...
        Comparator.nullsLast((first, second) -> {  // here you have weightings
             if (first == 0) return 1;             // 0 and then null last
             if (second == 0) return -1;
             return first - second;
        })));

1, 2, 4, 7, 0, 0, ноль, ноль

...