Java流如何防止在lambda表达式中重复相同的值

Posted

技术标签:

【中文标题】Java流如何防止在lambda表达式中重复相同的值【英文标题】:Java stream how to prevent duplication of same value in lambda expression 【发布时间】:2021-12-11 05:53:59 【问题描述】:

我有字符串,我拆分为哈希映射

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&lt;&gt;(Arrays.asList(value))

例如:

app0=aaa,aaa 

包含重复项,所以我希望它在 ArrayList&lt;&gt;(Arrays.asList(value)) 中只有 1 个“aaa”

【问题讨论】:

我能想到的最简单的解决方案是使用str[1].split(",") 创建一个集合,然后将其转换为一个数组。 什么意思? 使用HashSet 而不是ArrayList 只需添加.distinct()? @dan1st 在哪里? 【参考方案1】:

我想这就是你要找的。​​p>

像你一样继续toMap部分 但对于值,只需创建一个新流,在逗号和 使用 distinct 转换为列表以消除重复项。 我建议使用list 而不是set,因为集合是无序的,因此无法被索引。如果这无关紧要,请转换为集合并删除不同的调用。并将地图目标更改为Set&lt;String&gt;
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]

【讨论】:

在 distinct() 使用 java 8 之后 toList 在这里不起作用 然后使用 .collect(Collectors.toList()) 而不是 toList() 。我编辑了答案,它应该很快更新 我批准了编辑。谢谢!我正要这样做。它现在应该可以工作了。 @user63898 BTW \w[a-zA-Z_0-9] 相同,因此如果您希望缩短正则表达式,可以使用它。但你的做法没有错。 @WJS 你忽略了 1 件重要的事情我需要用 forEach (遗留代码)填充 hashmap,我现在也改变了我的问题以使用 List

以上是关于Java流如何防止在lambda表达式中重复相同的值的主要内容,如果未能解决你的问题,请参考以下文章

java - 如何使用 lambda 表达式从 forEach 方法中中断[重复]

Java_lambda表达式 Stream流 Option类

java8新特性,使用流遍历集合

Java高阶进阶之Java函数式编程-Stream流-Lambda表达式

Java高阶进阶之Java函数式编程-Stream流-Lambda表达式

Java Stream流(详解)