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

标签 java java-8 collectors

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

相关文章:

java - 无法从 Json 字符串创建对象列表

java - Apache Beam PubSubIO 写入

java - 将流映射到另一个对象的实例

java - Hashmap with Streams in Java 8 Streams 收集 Map 的值

java - 在java中设计一个项目

java - Ant 无法构建 :"Compile failed; see the compiler error output for details."

java - 使用java流检查两个日期是否连续

java - 当它说类没有接受 String[] 的 static void main 方法时,在哪里添加 main 方法

java - jsp页面中无法解析类

java - 使用流收集器从 java 对象获取键值