отсортировано в потоке не применимо - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть этот фрагмент кода Java8:

Set<Purchase> purchases = 
    user.getAcquisitions()
        .parallelStream()
        .map(a -> a.getPurchases())
    .sorted(Comparator.comparing(Purchase::getPurchaseDate).reversed());

Но у меня есть эта ошибка компиляции, и я не знаю почему:

The method sorted(Comparator<? super Set<Purchase>>) in the type Stream<Set<Purchase>> is not applicable for the arguments 
 (Comparator<Purchase>)

Ответы [ 4 ]

0 голосов
/ 15 декабря 2018

a.getPurchases () дает вам набор, и ваш компаратор сравнивает элементы набора, а не наборы.

Исходя из вашего ожидаемого результата, я понимаю, что вы хотите получить набор с последней датой покупки.Если каждый набор содержит только покупки с одинаковыми датами покупки, вы можете создать свой компаратор следующим образом:

 .sorted(Comparator.comparing(purchases -> purchases.iterator().next(), (p1, p2) -> -p1.compareTo(p2)));

Если даты покупки отличаются внутри набора, вам нужно получить максимальную (или минимальную) дату покупки внутри набора,затем сравните это между наборами, что-то вроде:

final Stream<Set<Purchase>> sorted = acquisitions.stream()
    .map(Acquisition::getPurchases)
    .sorted(Comparator.comparing(purchases ->
            Collections.max(purchases, Comparator.comparing(Purchase::getPurchaseDate)).getPurchaseDate(),
            (date1, date2) -> -date1.compareTo(date2)));
0 голосов
/ 15 декабря 2018

Попробуйте сделать это так:

 Set<Purchase> purchases = 
    user.getAcquisitions()
        .parallelStream()
        .map(Acquisition::getPurchases)
        .flatMap(Set::stream)
        .collect(Collectors.toCollection(TreeSet::new));
0 голосов
/ 15 декабря 2018

Чтобы расширить ответ Джо , кажется, что вы хотите Set<Purchase> в отсортированном порядке (по какой бы то ни было причине), если у вас есть веская причина для этого, и в этом случае вы можетеиспользуйте LinkedHashSet:

user.getAcquisitions()
    .parallelStream()
    .flatMap(e -> e.getPurchase().stream())
    .sorted(Comparator.comparing(Purchase::getPurchaseDate).reversed())
    .collect(toCollection(LinkedHashSet::new));
  • flatMap, чтобы объединить вложенные Set<Purchase> в Stream<Purchase>
  • , затем отсортировать элементы в соответствии с предоставленным компаратором
  • затем собирает элементы в реализацию LinkedHashSet, которая учитывает порядок вставки.

Кстати, обратите внимание, что вы также можете просто сделать:

user.getAcquisitions()
    .parallelStream()
    .flatMap(e -> e.getPurchase().stream())
    .distinct()
    .sorted(Comparator.comparing(Purchase::getPurchaseDate).reversed())
    .collect(toCollection(ArrayList::new));

так, в зависимости отв контексте, в котором вы используете результирующие элементы, вам лучше собирать их для реализации списка.

  • flatMap объединяет вложенные Set<Purchase> в Stream<Purchase>
  • Different возвращает новый поток уникальных объектов в соответствии с методом equals.
  • , затем сортирует элементы в соответствии с предоставленным компаратором
  • , наконец, затем собирает элемент из потока вArrayList реализация.
0 голосов
/ 15 декабря 2018

После .map(a -> a.getPurchases()) вы, похоже, ожидаете Stream<Purchase>, но у вас действительно есть Stream<Set<Purchase>>.

Если Stream<Purchase> действительно то, что вы хотите, вместо этого вы должны использовать

.flatMap(a -> a.getPurchases().stream())
...