Java 8 - Stream - ссылаться на составные объекты - PullRequest
0 голосов
/ 03 апреля 2019

У меня List<Entry> entries, со структурой кода ниже,

class Entry {
    public Product getProduct() {
        return product;
    }
}

class Product {

    public List<CategoriesData> getCategories() {
        return categoriesData;
    }
}

class CategoriesData {

    public String getName() {
        return name;
    }
}

Я смотрю на сортировку по Product - CategoriesData - name (из первого элемента в List<CategoriesData>)

// Not sure how to refer Name within CategoriesData, 
// entries.stream().sorted(
//   Comparator.comparing(Entry::getProduct::getCategories::getName))
//                      .collect(Collectors.toList())

Ответы [ 3 ]

0 голосов
/ 03 апреля 2019

Используя решение Mureinik, вы можете:

Comparator<Entry> entryComperator = Comparator
                .comparing(e -> e.getProduct().getCategories().get(0).getName());
        List<Entry> sorted =
                entries.stream()
                        .sorted(entryComperator)
                        .collect(Collectors.toList());

Вы можете рассмотреть возможность доступа к имени из списка лучше, если список пуст. Вы можете скрыть всю эту логику в компараторе, как я делал выше

0 голосов
/ 04 апреля 2019

С помощью @Mureinik и внесением некоторых изменений я остановился на приведенном ниже, и он работает.Мое требование немного изменилось, мне нужен результат в карте.Название категории - это ключ на карте, значением будет список «Вступление».

 final Map<String, List<Entry>> sortedMap =
        data.getEntries().stream()
        .sorted(Comparator.comparing(e -> ((Entry) e).getProduct().getCategories().stream().findFirst().get().getName())
               .thenComparing(Comparator.comparing(e -> ((Entry) e).getProduct().getName())) )
        .collect(Collectors.groupingBy(e -> e.getProduct().getCategories().stream().findFirst().get().getName(),
                 LinkedHashMap::new, Collectors.toList())); 
0 голосов
/ 03 апреля 2019

Если вы пытаетесь отсортировать по первой категории, вам нужно обратиться к ней в компараторе:

List<Entry> sorted = 
    entries.stream()
           .sorted(Comparator.comparing(
                                  e -> e.getProduct().getCategories().get(0).getName())
           .collect(Collectors.toList())

EDIT:
Чтобы ответить на вопрос в комментариях, для вторичной сортировки вам нужно будет указать тип в Comparator:

List<Entry> sorted = 
    entries.stream()
           .sorted(Comparator.comparing(
                                  e -> e.getProduct().getCategories().get(0).getName())
                             .thenComparing(
                                  (Entry e) -> e.getProduct().getName())
           .collect(Collectors.toList())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...