java 8流收集最大对象,并按属性区分

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java 8流收集最大对象,并按属性区分相关的知识,希望对你有一定的参考价值。

某些列表在这里

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

每个1个元素

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 -> book.stream().max(Comparator.comparingInt(Book::getCost)))
                       .filter(Optional::isPresent)
                       .map(Optional::get)
                       .collect(Collectors.toList());

以上是关于java 8流收集最大对象,并按属性区分的主要内容,如果未能解决你的问题,请参考以下文章

《Java8实战》 - 读书笔记 - Stream流操作2:用流收集数据

Java8-用流收集数据

Java 8 Stream 流 - 收集数据

I/O流

JDK1.8新特性:Collectors收集器类

Python类中属性和方法区分3-8