it-roy-ru.com

отсортировано в потоке не применимо

У меня есть этот кусок кода 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
Nuñito de la Calzada

Чтобы расширить ответ Джо , похоже, вам нужен 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
2
Aomine

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

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

.flatMap(a -> a.getPurchases().stream())
9
Joe C

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)));
1
ctenescu

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

 Set<Purchase> purchases = 
    user.getAcquisitions()
        .parallelStream()
        .map(Acquisition::getPurchases)
        .flatMap(Set::stream)
        .collect(Collectors.toCollection(TreeSet::new));
0
ETO