Javaの8ストリームコレクト最大オブジェクトとプロパティによって異なりました

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())));

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=13239&siteId=1