gpt4 book ai didi

java - 在收集流时搜索等效的JDK进行转换

转载 作者:行者123 更新时间:2023-12-04 00:32:44 25 4
gpt4 key购买 nike

问题

我有一个ListRequest对象,其中每个请求都包含原始主机和所请求的URL。我想将其转换为Map<String, Set<String>>,其中键是主机,值是主机已调用的唯一URL。

我自己的解决方案

我发现您可以使用Collectors.groupingByList转换为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 - 在收集流时搜索等效的JDK进行转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61986126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com