Merging two Map with Java 8 Stream API

前端 未结 6 1128
孤城傲影
孤城傲影 2020-11-30 19:17

I have two (or more) Map objects. I\'d like to merge them with Java 8 Stream API in a way that values for common keys should be the maxim

6条回答
  •  -上瘾入骨i
    2020-11-30 19:36

    @Test
    public void test14() throws Exception {
        Map m1 = ImmutableMap.of("a", 2, "b", 3);
        Map m2 = ImmutableMap.of("a", 3, "c", 4);
    
        Map mx = Stream.of(m1, m2)
            .map(Map::entrySet)          // converts each map into an entry set
            .flatMap(Collection::stream) // converts each set into an entry stream, then
                                         // "concatenates" it in place of the original set
            .collect(
                Collectors.toMap(        // collects into a map
                    Map.Entry::getKey,   // where each entry is based
                    Map.Entry::getValue, // on the entries in the stream
                    Integer::max         // such that if a value already exist for
                                         // a given key, the max of the old
                                         // and new value is taken
                )
            )
        ;
    
        /* Use the following if you want to create the map with parallel streams
        Map mx = Stream.of(m1, m2)
            .parallel()
            .map(Map::entrySet)          // converts each map into an entry set
            .flatMap(Collection::stream) // converts each set into an entry stream, then
                                         // "concatenates" it in place of the original set
            .collect(
                Collectors.toConcurrentMap(        // collects into a map
                    Map.Entry::getKey,   // where each entry is based
                    Map.Entry::getValue, // on the entries in the stream
                    Integer::max         // such that if a value already exist for
                                         // a given key, the max of the old
                                         // and new value is taken
                )
            )
        ;
        */
    
        Map expected = ImmutableMap.of("a", 3, "b", 3, "c", 4);
        assertEquals(expected, mx);
    }
    

提交回复
热议问题