首页 > 解决方案 > 如何将流收集到 JAX-RS MultivaluedMap 中?

问题描述

a of 项目如何Stream被收集到一个MultivaluedMap?内置的 JavaMap收集器不能很好地用于此目的,因为它们希望对 map ( K,List<V>) 的列表类型进行操作,而不是 ( ) 的MultivaluedMap类型<K,V>

标签: javajava-streamjax-rs

解决方案


Stream.collect(supplier, accumulator, combiner)方法可用于完成此操作。以下将从MultivaluedMap流和任意keyFn&valueFn Function对创建一个:

MultivaluedMap<K, V> multimap = list.stream().collect(
        MultivaluedHashMap::new,
        (multimap, input) -> multimap.add(keyFn.apply(input), valueFn.apply(input)),
        MultivaluedMap::putAll);

这将使用 创建一个或多个多图new MultivaluedHashMap(),使用 将元素添加到这些多图MultivaluedMap.add(),并使用 将这些多图组合在一起MultivaluedMap.putAll()

Stream.collectJavadocs 解释了这种方法:

对此流的元素执行可变归约操作。可变归约是一种归约值是可变结果容器,例如ArrayList, 并且通过更新结果的状态而不是替换结果来合并元素。

由于可以并行处理流,因此MultivaluedMap可能会创建多个临时实例,每个中间实例都Stream包含 的值的子集。临时多图将MultivaluedMap通过使用putAll将临时多图中的所有元素放入其中一个多图中组合成一个,然后将其作为最终结果返回。

例子

下面将从 a 创建一个MultivaluedMap<Integer, String>Stream<String>其中键是字符串的长度,值是字符串本身:

Stream<String> strings = Stream.of("Ant", "Ball", "Cat", "Ant", "House");
MultivaluedMap<Integer, String> stringsByLength = strings.collect(
        MultivaluedHashMap::new,
        (multimap, input) -> multimap.add(input.length(), input),
        MultivaluedMap::putAll
);
System.out.println(stringsByLength); // {3=[Ant, Cat, Ant], 4=[Ball], 5=[House]}

推荐阅读