【问题标题】:Java 8 cyclic inference warningJava 8 循环推理警告
【发布时间】:2014-10-17 09:38:28
【问题描述】:

我对列表操作的了解来自脚本语言。因此,在 Java 中,如果找到具有特定名称的 cookie,我会停下来做一些奇怪的事情。

List<Cookie> cookies = Arrays.asList(request.getCookies());
        String auth = cookies.stream()
                .filter(c -> c.getName().equals("auth"))
                .map(Cookie::getValue);

map 方法中,IntelliJ 向我展示了“循环推理”。

Java 编译器错误:(52, 25) java:不兼容的类型:不存在类型变量 R 的实例,因此 java.util.stream.Stream 符合 java.lang.String

【问题讨论】:

  • 如消息所述,map 返回一个Stream,不能分配给String。你必须告诉它应该如何成为一个单一的String。也许你想使用.findAny().get()
  • 很好的问答,但我仍然不知道什么是循环推理!将继续谷歌搜索,这是第一个结果。
  • @JimLohse 这个答案解释了什么是循环推理:stackoverflow.com/a/36258012/3142816。基本上,没有外部子表达式的类型就无法推断出内部子表达式的类型,没有内部子表达式的类型就无法推断出内部子表达式的类型

标签: intellij-idea lambda java-8


【解决方案1】:

你当前的代码返回一个Stream&lt;String&gt;,所以你需要一个额外的步骤来返回一个字符串:

Optional<String> auth = cookies.stream()
            .filter(c -> c.getName().equals("auth"))
            .map(Cookie::getValue)
            .findAny();

请注意,它返回一个Optional&lt;String&gt;,因为可能没有匹配“auth”的Cookie。如果您想在未找到“auth”的情况下使用默认值,您可以使用:

String auth = cookies.stream()
            .filter(c -> c.getName().equals("auth"))
            .map(Cookie::getValue)
            .findAny().orElse("");

【讨论】:

    【解决方案2】:

    本质上,这个相当神秘的错误消息是说“流序列的输出与您最终分配给它的内容不匹配”,例如:

    String s = list.stream().map(s -> s); // this doesn't result in a String...
    

    .findFirst().get() 因此,要调试编译,请删除分配(暂时),或者,正如另一个答案所说,添加一些使其通过收集(例如:.collect(Collectors.joining(",")))或(变得像.findFirst().get())返回字符串的内容,或者更改分配,比如Stream&lt;String&gt; stream = list.stream().map(...)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-23
      • 2017-12-23
      • 1970-01-01
      • 2015-10-18
      • 2020-10-08
      • 2012-06-03
      • 2020-03-04
      相关资源
      最近更新 更多