![](/img/trans.png)
[英]Filter Map<String,List<Object>> Using Java Streams
[英]Remove duplicates in List<Map<String, Object>> using Streams in java
List<Map<String, Object>> apptlist = jdbcTemplate.queryForList(sb.toString());
在这里,我得到了一份清单。 在该列表中显示了重复的地图。 我需要使用 Java 8 Stream 删除这些重复项。 有谁能够帮我?
我试过 Stream 这个
Set<Map<String, Object>> set = new HashSet<>();
apptlist.stream().map(s -> s.toLowerCase()).filter(s -> !set.contains(s)).forEach(set::add);
和这个
apptlist.stream().distinct().collect(Collectors.toList());
但我没有得到任何结果。 不过,我得到了重复。
您不需要 stream API,创建一个Set
将消除重复项:
Set<Map<String, Object>> set = new HashSet<>(list);
前提是,equals map 具有相同的键,并且 Maps 中与该键关联的值实现了equals
和hashCode
。
当它们的长度相等并且对于每个键 map1[key].equals(map2[key]) 时,映射是相等的
String
在 java 中具有适当的 equals 方法,但Object
没有。
默认为equals
的实现是比较 object 的地址,而不是其字段值。
我们可以看到您的代码在使用具有适当equals
方法的值时正常工作,例如Integer
import java.util.List;
import java.util.Map;
import java.util.Arrays;
import java.util.HashMap;
import java.util.stream.Collectors;
class Main {
public static void main(String[] args) {
Map<String, Integer> map1 = new HashMap<>();
Map<String, Integer> map2 = new HashMap<>();
map1.put("a", 1);
map1.put("b", 2);
map2.put("a", 1);
map2.put("b", 2);
List<Map<String, Integer>> mapList = Arrays.asList(map1, map2);
System.out.println(mapList.stream().distinct().collect(Collectors.toList()));
}
}
[{a=1, b=2}]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.