我不确定之前是否有人回答过这个问题。谁能告诉我我写的第三个 groupBy
有什么问题?为什么不能推断呢?
class TestGroupBy
{
enum LifeCycle {
ANNUAL, PERENNIAL
}
private String name;
private LifeCycle lifeCycle;
TestGroupBy(String name, LifeCycle lifeCycle) {
this.name = name;
this.lifeCycle = lifeCycle;
}
LifeCycle getLifeCycle() {
return this.lifeCycle;
}
static EnumMap mySupplier() {
return new EnumMap(TestGroupBy.class);
}
public static void main(String[] args) {
List<TestGroupBy> garden = new ArrayList<>();
garden.add(new TestGroupBy("Test1", TestGroupBy.LifeCycle.ANNUAL));
garden.add(new TestGroupBy("Test2", TestGroupBy.LifeCycle.PERENNIAL));
garden.add(new TestGroupBy("Test4", TestGroupBy.LifeCycle.ANNUAL));
garden.add(new TestGroupBy("Test5", TestGroupBy.LifeCycle.PERENNIAL));
// This works
garden.stream()
.collect(Collectors.groupingBy(e -> e.getLifeCycle()));
// This works
garden.stream()
.collect(Collectors.groupingBy(
e -> e.getLifeCycle(),
TestGroupBy::mySupplier,
Collectors.toSet()
));
// This does not work
garden.stream()
.collect(Collectors.groupingBy(
e -> e.getLifeCycle(), // Can not resolve method getLifeCycle()
new EnumMap(TestGroupBy.class),
Collectors.toSet()));
}
}
最佳答案
停止使用原始类型!
这是没有原始类型的 mySupplier
:
static EnumMap<LifeCycle, Set<TestGroupBy>> mySupplier() {
return new EnumMap<>(LifeCycle.class);
}
EnumMap
的键类型必须是枚举类型,因此您应该使用LifeCycle
作为第一个参数。第二个参数是您最后使用的收集器返回的内容。您在这里使用了 toSet
,所以我想您需要一组 TestGroupBy
。
这就是您的供应商应有的样子,具有适当的通用参数 和 LifeCycle.class
作为 EnumMap
的键类型!
现在,您可以这样做:
garden.stream()
.collect(Collectors.groupingBy(
e -> e.getLifeCycle(),
() -> new EnumMap<>(LifeCycle.class),
Collectors.toSet()));
请注意,您必须添加 () ->
才能使其成为供应商。
关于java - 无法推断 groupBy Java 8 中的功能接口(interface)类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48172470/