hashmap stream流去重
时间: 2023-09-01 10:07:09 浏览: 60
可以使用Java 8中的Stream流和HashMap来去重。具体步骤如下:
1. 将元素转换为Map的key,value可以是任意值,这里选择使用元素自身作为value
```
List<String> list = Arrays.asList("a", "b", "c", "a", "d");
Map<String, String> map = list.stream().collect(Collectors.toMap(Function.identity(), Function.identity()));
```
2. 将Map中的key转换回List,即可得到去重后的List
```
List<String> distinctList = new ArrayList<>(map.keySet());
```
完整代码如下:
```
List<String> list = Arrays.asList("a", "b", "c", "a", "d");
Map<String, String> map = list.stream().collect(Collectors.toMap(Function.identity(), Function.identity()));
List<String> distinctList = new ArrayList<>(map.keySet());
System.out.println(distinctList);
```
输出结果为:[a, b, c, d]
相关问题
stream流根据某个字段去重
stream流可以根据某个字段进行去重。首先,我们可以使用`distinct`方法对流中的元素进行去重。然而,`distinct`方法默认使用对象的`equals`方法来判断是否重复,所以如果我们想根据某个字段进行去重,我们需要重写对象的`equals`方法,以便比较特定字段的值。另外,我们还可以使用`collect`方法结合`toMap`方法来实现根据某个字段去重的功能。具体步骤如下:
1. 定义一个对象类,重写`equals`和`hashCode`方法,选择要用于比较的字段,比如`name`或`age`。
2. 将对象流转换为键值对流,通过`toMap`方法指定要用于比较的字段为键,值为对象本身。这样,相同字段的对象会被覆盖,保留最后一个对象。
3. 将键值对流转换为对象流,通过`values`方法获取所有的对象。
通过以上步骤,我们就可以根据某个字段对stream流进行去重了。
中给出的示例展示了如何使用以上方法根据`name`和`age`字段进行去重。
请注意,如果你想保留第一个出现的对象而去除后续重复的对象,可以使用`LinkedHashMap`来替代`toMap`方法中的`HashMap`,这样可以保留插入顺序。<span class="em">1</span><span class="em">2</span>
#### 引用[.reference_title]
- *1* [Java中对List去重 Stream去重的解决方法](https://download.csdn.net/download/weixin_38667403/12761286)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
- *2* [stream -根据指定字段去重](https://blog.csdn.net/qq_37700773/article/details/130348912)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]
stream去重map
根据提供的引用内容,使用stream去重map的方法如下所示:
首先,创建一个List来存储Map对象:
```
List<Map<String, String>> list = new ArrayList<>();
Map<String, String> map = new HashMap<>();
map.put("id", "id1");
map.put("name", "name1");
map.put("age", "22");
list.add(new HashMap<>(map));
map.put("id", "id1");
map.put("name", "name1");
map.put("age", "22");
list.add(new HashMap<>(map));
map.put("id", "id1");
map.put("name", "name2");
map.put("age", "22");
list.add(new HashMap<>(map));
map.put("id", "id2");
map.put("name", "name2");
map.put("age", "32");
list.add(new HashMap<>(map));
```
然后,使用stream和collect方法结合起来,使用Collectors.collectingAndThen方法和TreeSet来去除重复的map对象,通过对比id和name字段来判断两个map是否相等:
```
list = list.stream()
.collect(Collectors.collectingAndThen(
Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing((o) -> o.get("id") + ";" + o.get("name")))),
ArrayList::new));
```
这样,list中的map对象就会被去重,只保留一个拥有相同id和name字段的map对象。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* [Java--Stream的两个小用法(去重+map排序)](https://blog.csdn.net/GuessBUG/article/details/96109069)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
- *2* *3* [使用Stream流对List中的Map进行多条件去重](https://blog.csdn.net/wounler/article/details/121522761)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"]
[ .reference_list ]