当前位置: 首页 > 知识库问答 >
问题:

映射列表以映射Java 8流和groupingBy

元昊苍
2023-03-14

我有这个简单的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<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方式来正确地做这件事,但是试图通过Java8个新特性来做这件事。感谢帮助。

共有1个答案

郭知
2023-03-14

你可以这样做:

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

从<code>流

 类似资料:
  • 我有一个实体,看起来像这样: 输入数据是一个

  • 我在迭代一个对象内的列表时遇到了一个问题,该对象内嵌在另一个映射中。我的目标是迭代这个列表并生成一个映射 ,我希望使用streams和lamdas来实现这一点。 我在上面看到了,我需要通过迭代FolderBo中的elementList从elementBo创建一个带有map 的映射。folderBo本身就在Modelbo的地图内。

  • 我正在从文件中读取值并获取列表。如下- 一旦我得到这个

  • 问题内容: 我有一个带有以下签名的类: 我想要一个来自a 的键,该键将是该类的名称。我如何使用java8流按es名称对列表进行分组?所有es在名称上都是唯一的。 可以在单个流中求解,还是应该以某种方式拆分它还是采用经典解决方案? 问题答案:

  • 我有映射键作为字符串和值作为列表。列表可以有10个唯一值。我需要转换这个映射键为整数和值为列表。示例如下: 输入: 2:“钥匙-1”,“钥匙-2” 3:“钥匙-1”、“钥匙-2”、“钥匙-3” 4:“钥匙-1”、“钥匙-2”、“钥匙-3”

  • 的默认行为 mapper() 在映射的 Table 到映射的对象属性中,每个属性都根据列本身的名称命名(特别是 key 属性 Column )这种行为可以通过几种方式进行修改。 从属性名称清楚地命名列 默认情况下,映射与 Column 与映射属性的相同-具体来说,它与 Column.key 属性对 Column ,默认与 Column.name . 指定给映射到的python属性的名称 Colum