在Java 8中如何在不使用POJO的情况下进行分组

8

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

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函数的分组操作,是否有方法可以实现这一点或者必须创建一个POJO来使用groupingBy

2个回答

7
你可以这样做:
Map<String, List<String>> result = source.stream()
    .map(s -> s.split("-"))
    .collect(Collectors.groupingBy(a -> a[0], 
        Collectors.mapping(a -> a[1], Collectors.toList())));

1

或者,您可以直接使用 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]));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接