java - 如何将流收集到 JAX-RS MultivaluedMap 中?
问题描述
a of 项目如何Stream
被收集到一个MultivaluedMap
?内置的 JavaMap
收集器不能很好地用于此目的,因为它们希望对 map ( K,List<V>
) 的列表类型进行操作,而不是 ( ) 的MultivaluedMap
类型<K,V>
。
解决方案
该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.collect
Javadocs 解释了这种方法:
对此流的元素执行可变归约操作。可变归约是一种归约值是可变结果容器,例如
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]}
推荐阅读
- c# - 这两个简单的 Async 和 Await 实现之间的输出差异
- .net - .NET Core 在 AzuerAD 身份验证后添加声明
- css - 尽管设置了最小宽度和高度,但溢出在网格列中不起作用
- java - Android 9:虽然有 cleartextTrafficPermitted="true",但不允许明文 HTTP 流量
- ios - UICollectionView 两个具有相同视图的单元格。第二个单元格不显示任何内容
- r - 函数中的 lme 对象使用上一次运行的响应变量
- scikit-learn - Anaconda Scikit-learn 最新版本
- excel - Workbook_BeforeClose() 在第一部分起作用,但不关闭 Workbook
- bash - 在所有子目录中递归运行命令
- deepsecurity - 更新名称存在多次的计算机对象时出现 REST API 错误