在java 8中不使用POJO进行分组

use*_*686 7 java collections lambda java-8 java-stream

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

10-A
10-B
11-C
11-A
Run Code Online (Sandbox Code Playgroud)

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

10,[A,B]
11,[C,A]
Run Code Online (Sandbox Code Playgroud)

有没有办法在不为这些记录创建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.))
Run Code Online (Sandbox Code Playgroud)

要么

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]));
Run Code Online (Sandbox Code Playgroud)

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

Rav*_*ala 6

你可以这样做,

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