Java 如何使用lambda计算对象字段中的重复数?

Java 如何使用lambda计算对象字段中的重复数?,java,lambda,Java,Lambda,我有一张书单 final List<Book> books = new ArrayList<>(); books.add(new Book(50, "Book1", 1997)); books.add(new Book(110, "Book2", 1998)); books.add(new Book(150, "Book3", 1999)); books.add(new Book(200, "Book4", 2000)); books.add(new Book(250,

我有一张书单

final List<Book> books = new ArrayList<>();
books.add(new Book(50, "Book1", 1997));
books.add(new Book(110, "Book2", 1998));
books.add(new Book(150, "Book3", 1999));
books.add(new Book(200, "Book4", 2000));
books.add(new Book(250, "Book1", 2001));

但它不起作用。请帮帮我。

构造一个集合,然后从集合中减去列表的大小。确保使用适当的比较器检测重复项。

构造一个集合,然后从集合中减去列表的大小。确保使用适当的比较器来检测重复项。

您错误地使用了
频率
方法-您需要传递一组书籍并查找一本书或一组字符串并查找一个字符串-但在传递一组书籍并查找一个字符串的那一刻,它将始终返回0

一种方法是:

Map<String, Long> frequency = books.stream()
    .map(Book::getTitle)
    .collect(Collectors.groupingBy(s -> s, Collectors.counting()));

您错误地使用了
frequency
方法-您需要传递一组书籍并查找一本书或一组字符串并查找一个字符串-但此时您传递一组书籍并查找一个字符串-因此它将始终返回0

一种方法是:

Map<String, Long> frequency = books.stream()
    .map(Book::getTitle)
    .collect(Collectors.groupingBy(s -> s, Collectors.counting()));

您遇到的问题是
b.getTitle()
不是列表中的对象。您持有的是
一本书
,而不是它的标题。此外,您可能没有实现
Book
,因此它可以与
字符串
相比较(这是可以的)

你能做什么,取决于你最感兴趣的是什么。下面是一个包含所有标题的示例,以及列表中具有该标题的书籍数量:

Map<String, Long> duplicatesPerTitle = 
                          books.stream()
                               .collect(Collectors.groupingBy(Book::getTitle, 
                                                              Collectors.counting()));
System.out.println("duplicatesPerTitle = " + duplicatesPerTitle);

您遇到的问题是
b.getTitle()
不是列表中的对象。您持有的是
一本书
,而不是它的标题。此外,您可能没有实现
Book
,因此它可以与
字符串
相比较(这是可以的)

你能做什么,取决于你最感兴趣的是什么。下面是一个包含所有标题的示例,以及列表中具有该标题的书籍数量:

Map<String, Long> duplicatesPerTitle = 
                          books.stream()
                               .collect(Collectors.groupingBy(Book::getTitle, 
                                                              Collectors.counting()));
System.out.println("duplicatesPerTitle = " + duplicatesPerTitle);

请提供一份报告。特别是,我怀疑您没有在Book类中实现
equals
,但是您没有显示代码……我已经用默认的Eclipse自动生成器实现了equals和hashCode。这已经足够了,“它不起作用”并不是对你所面临问题的有用描述。你能描述一下你的期望和发生了什么吗?请提供一个答案。特别是,我怀疑您没有在Book类中实现
equals
,但是您没有显示代码……我已经用默认的Eclipse自动生成器实现了equals和hashCode。这已经足够了,“它不起作用”并不是对你所面临问题的有用描述。你能描述一下你的期望和发生的事情吗?明白了。谢谢,明白了。谢谢你。
duplicatesPerTitle.entrySet().stream()
                             .filter(e -> e.getValue() > 1)
                             .forEach(System.out::println);