我对列表操作的了解来自脚本语言。所以在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
答案 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(...)