我有一个类似于this堆栈溢出问题的用例,并试图在不将结果存储在List<List<String>>中的情况下使用它,而是在它上调用stream().

如果因为类型不匹配而不将其赋值为List<List<String>>,则会出现奇怪的编译时错误.要重现这个问题,只需注释掉要输出的赋值.

问题是为什么会发生这种编译错误?以及如何修复它?

public static void main(String args[]) {
    List<String> input = Arrays.asList("RED", "RED", "BLUE", "BLUE", "BLUE", "BLUE", "RED", "RED");
    List<List<String>> output =  // if this line commented it doesn't compile
        input.stream()
            .collect(Collector.of(
                ArrayList::new,
                (accumulator, item) -> {
                    if (accumulator.isEmpty()) {
                        List<String> list = new ArrayList<>();
                        list.add(item);
                        accumulator.add(list);
                    } else {
                        List<String> last = accumulator.get(accumulator.size() - 1);
                        if (last.isEmpty() || last.get(0).equals(item)) {
                            last.add(item);
                        } else {
                            List<String> list = new ArrayList<>();
                            list.add(item);
                            accumulator.add(list);
                        }
                    }
                },
                (left, right) -> {
                    left.addAll(right);
                    return left;
                }
            ));
}

我的 idea 是这样使用它:

input.stream()
    .collect(Collector.of(.....))
    .stream()
    .(and do something else)

推荐答案

Java中的函数本身没有类型.他们是poly expressions岁.这意味着他们的类型应该从上下文中推断出来.它适用于Collector.of()的所有论点.

List<List<String>> output-提供target type,如果没有它,类型推理机制不知道您的收集器期望生成什么类型的对象.

要编译代码,您可以在呼叫Collector.<all the types of functions used in collector here>of()的同时使用type-witness.

编译此流语句的最简单方法是提供accumulator的显式参数类型:

(List<List<String>> accumulator, String item) ->
     {
          ...
     },

Java相关问答推荐

Mongo DB Bson和Java:在子文档中添加和返回仅存在于父文档中的字段?

找到允许的最大底片

最小拓Flutter 排序的时间复杂度是多少?

为什么Java的代码工作(if condition内部的实例)

如何以干净的方式访问深度嵌套的对象S属性?

Hibernate 6支持Joda DateTime吗?

尽管通过中断请求线程死亡,但线程仍将继续存在

在macOS上读取文件会导致FileNotFound,即使文件存在(并且具有权限)

Android无法在Java代码中调用Kotlin代码,原因是在Companion中使用Kotlin枚举时

获取所有可以处理Invent.ACTION_MEDIA_BUTTON Android 13 API33的Android包

在权限列表中找不到我的应用程序

在WHILE()循环初始化部分中声明和初始化变量的Java语法?

如何使JOOQ渐变脚本不重新创建表未更改的类?

Java泛型方法重载

message.acknowledge()没有';在使用Spring Boot在ActiveMQ中读取消息后,t将消息出列

使用DynamoDB增强客户端时未更新属性

具有 DayOfWeek 列表的 JPA 实体

为什么 PhantomReference.get() 总是返回 null?

将非滚动组件添加到 JScrollPane

与配置类中的自动装配字段相反是什么意思?