簡體   English   中英

刪除列表中的重復項<map<string, object> &gt; 在 java 中使用流</map<string,>

[英]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 中與該鍵關聯的值實現了equalshashCode

當它們的長度相等並且對於每個鍵 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM