gpt4 book ai didi

java8 Collectors.toMap() 限制?

转载 作者:搜寻专家 更新时间:2023-11-01 01:51:55 27 4
gpt4 key购买 nike

我正在尝试在 ZipEntryStream 上使用 java8 的 Collectors.toMap。这可能不是最好的主意,因为在处理过程中可能会发生异常,但我想这应该是可能的。

我现在遇到一个我不明白的编译错误(我猜是类型推断引擎)。

下面是一些提取的演示代码:

import java.io.IOException;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;

public class TestMapCollector {

private static class MyObject {
}

public static void main(String[] argv) throws IOException {
try (ZipFile zipFile = new ZipFile("test")) {
Map<String, MyObject> result = zipFile.stream()
.map(ZipEntry::getName)
.collect(Collectors.toMap(f -> "test", f -> new MyObject()));
}
}
}

此代码按原样构建,但如果您只是注释 .map(ZipEntry::getName) 行,它不会构建。好像如果输入是 String 流,toMap 收集器就可以工作,但如果输入是 ZipEntry 流,收集器就不能工作?

供引用,这是构建错误的开头,它很晦涩:

no suitable method found for collect(Collector<Object,CAP#1,Map<String,MyObject>>)
method Stream.<R#1>collect(Supplier<R#1>,BiConsumer<R#1,? super CAP#2>,BiConsumer<R#1,R#1>) is not applicable
(cannot infer type-variable(s) R#1
(actual and formal argument lists differ in length))
method Stream.<R#2,A>collect(Collector<? super CAP#2,A,R#2>) is not applicable
(cannot infer type-variable(s) R#2,A,CAP#3,T#2,K,U
(argument mismatch; Collector<CAP#2,CAP#4,Map<Object,Object>> cannot be converted to Collector<? super CAP#2,CAP#4,Map<Object,Object>>))
where R#1,T#1,R#2,A,T#2,K,U are type-variables:
R#1 extends Object declared in method <R#1>collect(Supplier<R#1>,BiConsumer<R#1,? super T#1>,BiConsumer<R#1,R#1>)
T#1 extends Object declared in interface Stream
R#2 extends Object declared in method <R#2,A>collect(Collector<? super T#1,A,R#2>)
A extends Object declared in method <R#2,A>collect(Collector<? super T#1,A,R#2>)
T#2 extends Object declared in method <T#2,K,U>toMap(Function<? super T#2,? extends K>,Function<? super T#2,? extends U>)
K extends Object declared in method <T#2,K,U>toMap(Function<? super T#2,? extends K>,Function<? super T#2,? extends U>)
U extends Object declared in method <T#2,K,U>toMap(Function<? super T#2,? extends K>,Function<? super T#2,? extends U...

最佳答案

问题似乎是由于流类型使用了通配符——不确定这是否是预期的行为。解决方法是:

zipFile.stream().map(ZipEntry.class::cast) //or .map(z -> (ZipEntry) z)

关于java8 Collectors.toMap() 限制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26157543/

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