【问题标题】:Grouping By without using a POJO in java 8在 Java 8 中不使用 POJO 进行分组
【发布时间】:2019-04-05 22:41:40
【问题描述】:

我有一个用例,我需要读取文件并获取序列的分组以及与序列关联的值列表。文件中这些记录的格式类似于 sequence - val , example

10-A
10-B
11-C
11-A

我希望输出是一个映射 (Map<String,List<String>>),其中序列作为键,与其关联的值列表作为值,如下所示

10,[A,B]
11,[C,A]

有没有一种方法可以在不为这些记录创建 POJO 的情况下做到这一点?我一直在尝试探索Collectors.groupingBy 的用法,我看到的大多数示例都是基于创建 POJO。

我一直在尝试写这样的东西

Map<String, List<String>> seqCpcGroupMap = pendingCpcList.stream().map(rec ->{
  String[] cpcRec = rec.split("-");
  return new Tuple2<>(cpcRec[0],cpcRec[1])
}).collect(Collectors.groupingBy(x->x.))

Map<String, List<String>> seqCpcGroupMap = pendingCpcList.stream().map(rec ->{
  String[] cpcRec = rec.split("-");
  return Arrays.asList(cpcRec[0],cpcRec[1]);
}).collect(Collectors.groupingBy(x->(ArrayList<String>)x[0]));

我无法为groupingBy 函数提供任何可能发生groupingBy 的键,有没有办法做到这一点,还是我必须创建一个POJO 才能使用groupingBy

【问题讨论】:

    标签: java lambda collections java-8 java-stream


    【解决方案1】:

    你可以这样做,

    Map<String, List<String>> result = source.stream()
        .map(s -> s.split("-"))
        .collect(Collectors.groupingBy(a -> a[0], 
            Collectors.mapping(a -> a[1], Collectors.toList())));
    

    【讨论】:

      【解决方案2】:

      或者,您可以直接使用Map.computeIfAbsent

      List<String> pendingCpcList = List.of("10-A","10-B","11-C","11-A");
      Map<String, List<String>> seqCpcGroupMap = new HashMap<>();
      pendingCpcList.stream().map(rec -> rec.split("-"))
              .forEach(a -> seqCpcGroupMap.computeIfAbsent(a[0], k -> new ArrayList<>()).add(a[1]));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-26
        • 1970-01-01
        • 1970-01-01
        • 2019-04-14
        • 2017-08-04
        相关资源
        最近更新 更多