我有一个逗号分隔字符串列表 -
List: format = <unique id, label>
----- values -----
ab123,X
cd123,Y
ab123,Y
cd123,Z
------------------
我想使用java 8将此列表转换为Map<String, List<String>>
,其中key是唯一ID,值将是标签列表(Map<unique-id, List<label>>).
示例 -
Map[
ab123=List[X, Y],
cd123=List[Y, Z]
]
请你在这里帮助我,以便我可以使用java 8实现这一点。
如果我想使用dto class -
,也可以代替MapClass A {
private String id;
private List<String> labelList;
// Getters and Setters methods
}
我希望创建一个class A
列表,例如 -
List[
A [id="ab123", labelList = List[X, Y],
A [id="cd123", labelList = List[Y, Z]
]
我怎么能得到它?
答案 0 :(得分:4)
yourList.stream()
.map(x -> x.split(",", 2))
.collect(Collectors.groupingBy(
x -> x[0],
Collectors.mapping(x -> x[1], Collectors.toList())
));
答案 1 :(得分:1)
使用Java 8 stream api,执行您尝试的操作非常简单。我将分两步向你解释。
List<String> list = new ArrayList<>();
list.add("ab123,X");
list.add("cd123,Y");
list.add("ab123,Y");
list.add("cd123,Z");
Map<String, List<String>> result = list.stream()
.map(e -> e.split(","))
.collect(Collectors.groupingBy(
e -> e[0],
Collectors.mapping(e -> e[1], Collectors.toList())
));
// print the result
result.entrySet().stream().forEach(System.out::println);
输出:
cd123=[Y, Z]
ab123=[X, Y]
一步一步:
list.stream()
将您的列表转换为流。map(e -> e.split(",")
将您的字符串列表转换为两个值数组[key,value]的列表。collect(...)
使用相同的密钥对数组元素进行分组。List<String> list = new ArrayList<>();
list.add("ab123,X");
list.add("cd123,Y");
list.add("ab123,Y");
list.add("cd123,Z");
List<MyAwesomeDto> result = list.stream()
.map(e -> e.split(","))
.collect(Collectors.groupingBy(
e -> e[0],
Collectors.mapping(e -> e[1], Collectors.toList())
))
.entrySet()
.stream()
.map(e -> new MyAwesomeDto(e.getKey(), e.getValue()))
.collect(Collectors.toList());
// print the result
result.stream().forEach(System.out::println);
我们只需添加一个步骤即可将所有地图Entry
映射到DTO。
希望这会帮助你。
答案 2 :(得分:0)
使用正则表达式匹配来过滤所有与给定模式不匹配的字符串:
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
public class ListToMapExample {
public static void main(String[] args) {
final List<String> list = Arrays.asList("ab123,X", "cd123,Y", "ab123,Y", "cd123,Z", "incorrect string", "", "a");
final Pattern pattern = Pattern.compile("^([^,]+),(.*)$");
final Map<String, List<String>> map = list.stream()
.map(pattern::matcher)
.filter(Matcher::matches)
.collect(Collectors.groupingBy(
matcher -> matcher.group(1),
Collectors.mapping(
matcher -> matcher.group(2),
Collectors.toList()
))
);
System.out.println(map);
}
}
输出:
{cd123=[Y, Z], ab123=[X, Y]}