简体   繁体   中英

Remove duplicates in List<Map<String, Object>> using Streams in java

List<Map<String, Object>> apptlist = jdbcTemplate.queryForList(sb.toString());

Here I got a list. In that list duplicate maps are showing. I need to remove those duplicates using Java 8 Stream. Can anybody help me?

I tried Stream this

Set<Map<String, Object>> set = new HashSet<>();
apptlist.stream().map(s -> s.toLowerCase()).filter(s -> !set.contains(s)).forEach(set::add);

and this

apptlist.stream().distinct().collect(Collectors.toList());

but I didn't get any results. Still, I am getting duplicates.

You don't need the stream API, creating a Set will elimnate duplicates:

Set<Map<String, Object>> set = new HashSet<>(list);

Provided that, equals map has the same keys, and the values associated to that keys in the Maps implements equals and hashCode .

Maps are equal when their length equals and for every key map1[key].equals(map2[key])

String has a proper equals method in java but Object does not.
Default equals implementation for Object compares the address of the object, not its fields values.

We can see your code works properly when using values with proper equals method such as 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}]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM