Java 8 : grouping field values by field names

标签 java java-8 java-stream

我正在尝试找到一种比以下更优雅的方法来创建一个映射,该映射使用 Java 8 按字段名称对字段值进行分组:

@Test
public void groupFieldValuesByFieldNames() {
    Person lawrence = aPerson().withFirstName("Lawrence").withLastName("Warren").born();
    Person gracie = aPerson().withFirstName("Gracie").withLastName("Ness").born();

    Map<String, List<String>> valuesByFieldNames = new HashMap<>();
    Stream.of(lawrence, gracie).forEach(person -> {
        valuesByFieldNames.computeIfAbsent("lastName", s -> new ArrayList<>()).add(person.getLastName());
        valuesByFieldNames.computeIfAbsent("firstName", s -> new ArrayList<>()).add(person.getFirstName());
    });

    assertThat(valuesByFieldNames, hasEntry("lastName", asList("Warren", "Ness")));
    assertThat(valuesByFieldNames, hasEntry("firstName", asList("Lawrence", "Gracie")));
}

最佳答案

试试这个。

Map<String, List<String>> valuesByFieldNames = Stream.of(lawrence, gracie)
    .flatMap(p -> Stream.of(new String[]{"firstName", p.getFirstName()},
                            new String[]{"lastName", p.getLastName()}))
    .collect(Collectors.groupingBy(a -> a[0],
             Collectors.mapping(a -> a[1], Collectors.toList())));

或者更一般地说

Map<String, List<String>> valuesByFieldNames = Stream.of(lawrence, gracie)
    .flatMap(p -> Stream.of(new AbstractMap.SimpleEntry<>("firstName", p.getFirstName()),
                            new AbstractMap.SimpleEntry<>("lastName", p.getLastName())))
    .collect(Collectors.groupingBy(e -> e.getKey(),
             Collectors.mapping(e -> e.getValue(), Collectors.toList())));

关于Java 8 : grouping field values by field names,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36948753/

相关文章:

java 小服务程序。重定向到静态页面不起作用

java - 如何求和 2 个 joda-time DateTime 值(一个包含日期和零时间,另一个包含时间和零日期)?

lambda - 为什么允许为 BiConsumer 分配只接受单个参数的函数?

java - 在流式传输另一个列表的同时将数据添加到列表中

java - 最频繁的元素流

java - 如何写入不同包中的xml文件

java - Android 应用程序带有数据库以便人们可以共享数据?

java - 表达式的目标类型必须是函数式接口(interface)——为什么需要这个?

java - 使用具有可选值的构建器模式的更好方法?

java - 将 Streams 与原始数据类型和相应的包装器一起使用