gpt4 book ai didi

java - 无法推断 groupBy Java 8 中的功能接口(interface)类型

转载 作者:搜寻专家 更新时间:2023-10-31 19:52:22 25 4
gpt4 key购买 nike

我不确定之前是否有人回答过这个问题。谁能告诉我我写的第三个 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/

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