java - 在收集流时搜索 JDK 等效项以进行转换
问题描述
问题
我有一个List
对象Request
,其中每个请求都包含源主机和请求的 URL。我想将其转换为Map<String, Set<String>>
,其中键是主机,值是主机调用的唯一 URL。
我自己的解决方案
我发现您可以使用Collectors.groupingBy
将 aList
转换为Map
. 这似乎是工作的方法,但它不符合我的全部需求。我不得不创建一个额外的功能:
private static <T, K> Collector<T, ?, Set<K>> toSet(Function<? super T, ? extends K> mapper) {
return Collector.of(
HashSet::new,
(list, item) -> list.add(mapper.apply(item)),
(list1, list2) -> {
list1.addAll(list2);
return list1;
}
);
}
使用这个函数,我可以这样做:
Map<String, Set<String>> hostUrls = getRequests().stream()
.map(r -> new ImmutablePair<>(r.getOriginHost(), r.getRequestUrl()))
.collect(Collectors.groupingBy(ImmutablePair::getLeft, toSet(ImmutablePair::getRight)));
问题
有没有办法在不创建这个额外toSet
功能的情况下进行这种转换?
我的愿望似乎没有那么极端。在将所有内容收集到一个之前,我想要一些额外的映射Set
(当然也可以是任何其他类型的集合)。我感觉我缺少一些功能,但我看不到哪个功能。
解决方案
您不需要定义任何额外的方法。您可以执行以下操作Collectors.mapping
。groupingBy
Collectors.mapping
有两个论点。第一个是映射器,第二个是下游。
Collector<T, ?, R> mapping(Function<? super T, ? extends U> mapper,
Collector<? super U, A, R> downstream)
通过使用toSet
下游,您可以完成您的任务。
Map<String, Set<String>> map = getRequests().stream()
.collect(Collectors.groupingBy(Request::getOriginHost,
Collectors.mapping(Request::getRequestUrl, Collectors.toSet())));
推荐阅读
- java - 任务':app:compileDebugJavaWithJavac'的本机执行失败
- performance - Unity:2D游戏的性能问题构建
- html - 如何水平对齐两列?
- java - GCP标准java11应用引擎上的Java Spring REST API:成功的appengine:部署但端点/路由无限期挂起
- maple - Maple - 未评估下标变量 T_0
- flutter-web - 使用 Flutter Web 1.9 打开外部链接
- laravel - laravel-5.8:此路由不支持 POST 方法。支持的方法:GET、HEAD
- haskell - Haskell - 函数评估
- python - Python:实际上在我的主文件旁边导入一个模块不起作用
- javascript - 在 NodeJS 中不使用换行符进行日志记录