Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java Stream Grouping by List<Map<String, Object>> to Map<Integer, List<Integer>>

I have a

List<Map<String, Object>>

coming from a Spring NamedParameterJdbcTemplate queryForList call. The data return looks like this:

[{"id":5,"uid":6}, {"id":5,"uid":7}, {"id":6,"uid":8}, {"id":7,"uid":7}, {"id":8,"uid":7}, {"id":8,"uid":9}]

How can I rearrange the data in the following format?

{5:[6, 7], 6:[8], 7:[7], 8:[7, 9]}

Im looking to return a Map<Integer, List<Integer>>

Anyone have an idea how I can achieve this? Any help much appreciated??

like image 468
DMcg Avatar asked Feb 24 '26 08:02

DMcg


1 Answers

This is a job for Collectors.groupingBy with a downstream collector like Collectors.mapping

 Map<Integer, List<Integer>> result = l.stream()
            .collect(Collectors.groupingBy(
                    m -> (Integer) (m.get("id")),
                    Collectors.mapping(m -> (Integer) m.get("uuid"), Collectors.toList())));

Or without streams at all:

list.forEach(x -> {
        Integer key = (Integer) x.get("id");
        Integer value = (Integer) x.get("uuid");
        result.computeIfAbsent(key, ignoreMe -> new ArrayList<>()).add(value);
    });
like image 129
Eugene Avatar answered Feb 25 '26 21:02

Eugene