将列表映射到 Map Java 8 stream 和 groupingBy
Mapping a list to Map Java 8 stream and groupingBy
我有这个简单的 Bean class:
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;
}
}
在我的主 class 中,我添加了一些信息到列表中:
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<String, List<String>>
所以输出(上面的地图)就像:
//isbn: value1, value2
1234: author1, author2
5678: author1
因此,我需要按 isbn 作为键,将作者作为值对条目进行分组。一个isbn可以有多个作者。
我正在尝试如下:
Map<String, List<String>> library = books.stream().collect(Collectors.groupingBy(Book::getAttribute));
无法更改 bean 的格式。如果 bean 有字符串值而不是 map,我可以做到,但坚持使用 map。
我已经编写了传统的 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>
,你用它包含的每个地图的流平面映射它,这样你就有了 Stream<Entry<String, String>>
。从那里,您可以按条目的键对元素进行分组,并将每个条目映射到您收集到值列表中的值。
我有这个简单的 Bean class:
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;
}
}
在我的主 class 中,我添加了一些信息到列表中:
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<String, List<String>>
所以输出(上面的地图)就像:
//isbn: value1, value2
1234: author1, author2
5678: author1
因此,我需要按 isbn 作为键,将作者作为值对条目进行分组。一个isbn可以有多个作者。
我正在尝试如下:
Map<String, List<String>> library = books.stream().collect(Collectors.groupingBy(Book::getAttribute));
无法更改 bean 的格式。如果 bean 有字符串值而不是 map,我可以做到,但坚持使用 map。
我已经编写了传统的 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>
,你用它包含的每个地图的流平面映射它,这样你就有了 Stream<Entry<String, String>>
。从那里,您可以按条目的键对元素进行分组,并将每个条目映射到您收集到值列表中的值。