Java stream 如何防止在 lambda 表达式中重复相同的值
Java stream how to prevent duplication of same value in lambda expression
我有字符串,我将其拆分为哈希映射
String myStrFromUser = "app0=aaa,aaa,app1=ccc,ddd,app3=ddd,app4=iii,ddd,qqq,www,iii";
private static HashMap<String, List<String>> myMap = = new HashMap<>();
Arrays.stream(myStrFromUser.split("(,(?=[A-Za-z0-9]*=[^A-Za-z0-9]*))"))
.map(String::trim)
.map(s -> s.split("="))
.collect(Collectors.toMap(str -> s[0], str -> str[1].split(",")))
.forEach((key, value) -> myMap.put(key, Arrays.asList(value)) );
问题是我喜欢防止将重复值插入新值 ArrayList<>(Arrays.asList(value))
例如:
app0=aaa,aaa
包含重复项,所以我希望它在 ArrayList<>(Arrays.asList(value))
中只有 1 个“aaa”
我想这就是您要找的。
- 像您一样继续
toMap
部分
- 但对于值,只需创建一个新流,以逗号和
使用 distinct 转换为列表以去除重复项。
- 我建议
list
而不是 set
,因为集合是无序的,因此无法索引。如果这无关紧要,请转换为一个集合并删除不同的调用。并将 Map 目标更改为 Set<String>
String myStrFromUser =
"app0=aaa,aaa,app1=ccc,ddd,app3=ddd,app4=iii,ddd,qqq,www,iii";
Map<String, List<String>> myMap = Arrays.stream(myStrFromUser
.split("(,(?=[A-Za-z0-9]*=[^A-Za-z0-9]*))"))
.map(String::trim).map(s -> s.split("="))
.collect(Collectors.toMap(str -> str[0], str -> Arrays
.stream(str[1].split(",")).distinct().collect(Collectors.toList())));
myMap.entrySet().forEach(System.out::println);
版画
app0=[aaa]
app1=[ccc, ddd]
app4=[iii, ddd, qqq, www]
app3=[ddd]
我有字符串,我将其拆分为哈希映射
String myStrFromUser = "app0=aaa,aaa,app1=ccc,ddd,app3=ddd,app4=iii,ddd,qqq,www,iii";
private static HashMap<String, List<String>> myMap = = new HashMap<>();
Arrays.stream(myStrFromUser.split("(,(?=[A-Za-z0-9]*=[^A-Za-z0-9]*))"))
.map(String::trim)
.map(s -> s.split("="))
.collect(Collectors.toMap(str -> s[0], str -> str[1].split(",")))
.forEach((key, value) -> myMap.put(key, Arrays.asList(value)) );
问题是我喜欢防止将重复值插入新值 ArrayList<>(Arrays.asList(value))
例如:
app0=aaa,aaa
包含重复项,所以我希望它在 ArrayList<>(Arrays.asList(value))
我想这就是您要找的。
- 像您一样继续
toMap
部分 - 但对于值,只需创建一个新流,以逗号和 使用 distinct 转换为列表以去除重复项。
- 我建议
list
而不是set
,因为集合是无序的,因此无法索引。如果这无关紧要,请转换为一个集合并删除不同的调用。并将 Map 目标更改为Set<String>
String myStrFromUser =
"app0=aaa,aaa,app1=ccc,ddd,app3=ddd,app4=iii,ddd,qqq,www,iii";
Map<String, List<String>> myMap = Arrays.stream(myStrFromUser
.split("(,(?=[A-Za-z0-9]*=[^A-Za-z0-9]*))"))
.map(String::trim).map(s -> s.split("="))
.collect(Collectors.toMap(str -> str[0], str -> Arrays
.stream(str[1].split(",")).distinct().collect(Collectors.toList())));
myMap.entrySet().forEach(System.out::println);
版画
app0=[aaa]
app1=[ccc, ddd]
app4=[iii, ddd, qqq, www]
app3=[ddd]