gpt4 book ai didi

java - 将列表映射到 Map Java 8 stream 和 groupingBy

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:54:49 25 4
gpt4 key购买 nike

我有这个简单的 Bean 类:

public class Book {     

public Book(Map<String, String> attribute) {
super();
this.attribute = attribute;
}
//key is isbn, val is author
private Map<String, String> attribute;

public Map<String, String> getAttribute() {
return attribute;
}
public void setAttribute(Map<String, String> attribute) {
this.attribute = attribute;
}

}

在我的主类中,我在列表中添加了一些信息:

    Map<String, String> book1Details = new HashMap<String, String>();
book1Details.put("1234", "author1");
book1Details.put("5678", "author2");
Book book1 = new Book(book1Details);

Map<String, String> book2Details = new HashMap<String, String>();
book2Details.put("1234", "author2");
Book book2 = new Book(book2Details);

List<Book> books = new ArrayList<Book>();
books.add(book1);
books.add(book2);

现在我想将书籍列表转换为这种形式的 map :

Map<String, List<String>>

所以输出(上面的 map )是这样的:

//isbn: value1, value2
1234: author1, author2
5678: author1

因此,我需要按 isbn 键和作者值对条目进行分组。一个 isbn 可以有多个作者。

我正在尝试如下:

Map<String, List<String>> library = books.stream().collect(Collectors.groupingBy(Book::getAttribute));

bean 的格式无法更改。如果 bean 有字符串值而不是映射,我可以做到,但坚持使用映射。

我已经编写了正确执行此操作的传统 Java 6/7 方法,但尝试通过 Java 8 新功能来执行此操作。感谢您的帮助。

最佳答案

你可以这样做:

Map<String, List<String>> library = 
books.stream()
.flatMap(b -> b.getAttribute().entrySet().stream())
.collect(groupingBy(Map.Entry::getKey,
mapping(Map.Entry::getValue, toList())));

来自Stream<Book> ,你用它包含的每个 map 的流平面映射它,这样你就有了一个 Stream<Entry<String, String>> .从那里,您可以按条目的键对元素进行分组,并将每个条目映射到您收集到值列表中的值。

关于java - 将列表映射到 Map Java 8 stream 和 groupingBy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30877202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com