user3066285:
いくつかの一覧はこちら
List<Book> list = new ArrayList<>();
{
list.add(new Book("Core Java", 200));
list.add(new Book("Core Java", 500));
list.add(new Book("Core Java", 800));
list.add(new Book("Learning Freemarker", 150));
list.add(new Book("Learning Freemarker", 1350));
list.add(new Book("Learning Freemarker", 1250));
list.add(new Book("Spring MVC", 300));
list.add(new Book("Spring MVC", 600));
list.add(new Book("Spring MVC", 1600));
}
私はこのような書籍のリストを表示したいです
Core Java", 800
Learning Freemarker", 1350
Spring MVC", 1600
各1element
list .stream().distinct()
.sorted(Comparator.comparing(Book::bookname)
.thenComparing(Book::getPrice)).collect(Collectors.toList());
このコードは、ソートされました。
デッドプール :
まず、上でグループを行うことができますBook
名前とにそれらを収集しMap<String, List<Book>>
、そしてからmap.values()
、各タイプからコレクト最高価格帳
List<Book> books = list.stream()
.collect(Collectors.groupingBy(Book::getName))
.values()
.stream()
.map(book -> Collections.max(book, Comparator.comparingInt(Book::getCost)))
.collect(Collectors.toList());
使用@Holgerによって提案された他のソリューションは、Collectors.toMap
最大の要素を収集し、見つけることに比べ、より効果的になります
List<Book> books = list.stream()
.collect(Collectors.collectingAndThen(
Collectors.toMap(Book::getName, Function.identity(),
BinaryOperator.maxBy(Comparator.comparingInt(Book::getCost))),
m -> new ArrayList<>(m.values())));