gpt4 book ai didi

Java 流 : Override return type of Collectors. 映射

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

这是我的代码:

Map<String, Collection<? extends String>> test = listOfTipusIdentificadorPacient.stream()
.collect(Collectors.groupingBy(
TipusIdentificadorPacient::getOid,
Collectors.mapping(TipusIdentificadorPacient::getUse, Collectors.toList())
)
);

我收到这条编译消息:

Type mismatch: cannot convert from Map<String,List> to Map<String,Collection<? extends String>>

我不太明白如何覆盖 Collectors.mapping 以便:

return:
Map<String,Collection<? extends String>>
instead of:
Map<String,List<String>>

我试图创建另一个通用代码以使其能够编译。

代码是:

Stream<Map.Entry<String, String>> streamOfPairedStrings = Stream.of();
Map<String, Collection<? extends String>> test = streamOfPairedStrings
.collect(Collectors.groupingBy(
Map.Entry::getKey,
Collectors.mapping(Pair::getValue, Collectors.toList())
)
);

有什么想法吗?

最佳答案

编译错误的原因是:

Map<String, List<String>> mapOfLists = Map.of();
Map<String, Collection<? extends String>> mapOfCollections = Map.of();

考虑到此代码将是合法的:

mapOfCollections.put("", Set.of());

也就是说,您可以在值不是 List<String> 的地方放置键/值对。因此,您不能分配:

mapOfCollections = mapOfLists;

因为这样你就可以执行上面的 put,导致堆污染。编译器只会阻止你这样做。

// If it were legal...
mapOfCollections = mapOfLists;
mapOfCollections.put("", Set.of());
List<String> list = mapOfLists.get(""); // ClassCastException!

我认为您可以在 Collectors.collectingAndThen 周围使用 toList() 来做到这一点,其中“然后”是一个不受约束的转换:

Collectors.collectingAndThen(Collectors.toList(), a -> a)

您不能使用 Function.identity() 执行此操作的原因是 collectingAndThenFunction.identity() 的签名的组合:

  • collectingAndThen(Collector<T,A,R> downstream, Function<R,RR> finisher) 表示函数的输入类型必须与收集器的输出类型匹配 - 在您的情况下为 List<String>
  • Function.identity() 是一个 Function<T, T>(没有通配符)。由于函数的输入类型必须是 List<String> ,它的输出类型也是 List<String>

a -> a 看起来像 identity 函数,但实际上比它更通用:它是一个向上转换函数 Function<? extends T, T> ,这意味着输出类型不必与输入完全相同,但是这是可以安全施放的东西。

因此,在这里,a -> a 充当 Function<List<String>, Collection<? extends String>>(因为 List<String>Collection<String> 的子类型,而 Collection<? extends String> 是 ojit_code 的子类型)。

关于Java 流 : Override return type of Collectors. 映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69009395/

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