Java 8循环推理警告

时间:2014-10-17 09:38:29

标签: intellij-idea lambda java-8

我对列表操作的了解来自脚本语言。所以在Java中我找到了一些奇怪的东西,以便找到具有特定名称的cookie。

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

map方法上,IntelliJ向我展示了#34;循环推理&#34;。

  

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

2 个答案:

答案 0 :(得分:37)

您当前的代码返回Stream<String>,因此您需要额外的步骤来返回字符串:

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

请注意,它会返回Optional<String>,因为可能没有符合&#34; auth&#34;的Cookie。如果您想使用默认值&#34; auth&#34;找不到你可以使用:

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

答案 1 :(得分:0)

从本质上讲,这个相当神秘的错误消息所说的是&#34;流序列的输出与你最终分配的内容并不匹配&#34;,例如:

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

.findFirst()。得到() 因此,要调试编译,删除分配(暂时),或者,正如另一个答案所说,添加一些东西,使其通过收集(例如:.collect(Collectors.joining(",")))或(变得像.findFirst().get())返回字符串,或更改作业,例如Stream<String> stream = list.stream().map(...)