2014-10-17 68 views
31

我对列表操作的了解来自脚本语言。所以在Java中,我停止了一些奇怪的事情,以找到使用特定名称的cookie。Java 8循环推理警告

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

map方法IntelliJ显示我“循环推理”。

Java compiler Error:(52, 25) java: incompatible types: no instance(s) of type variable(s) R exist so that java.util.stream.Stream conforms to java.lang.String

+2

正如消息所述,map将返回一个Stream,并且不能将其分配给String。你必须告诉它应该如何成为一个单一的'字符串'。也许你想使用'.findAny()。get()'? – Holger 2014-10-17 09:47:01

+2

不错的问题和答案,但我仍然不知道循环推理是什么!将继续谷歌搜索,这是第一个结果。 – JimLohse 2016-02-22 20:01:55

+0

@JimLohse这个答案解释了什么是循环推论:http://stackoverflow.com/a/36258012/3142816。基本上,内部子表达式的类型不能在没有外部子表达式类型的情况下被推断出来,如果没有内部子表达式类型 – sorianiv 2016-06-02 09:58:49

回答

36

您当前的代码返回一个Stream<String>,所以你需要一个额外的步骤返回一个字符串:

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

注意,它返回一个Optional<String>,因为可能没有曲奇符合“身份验证”。如果您想使用默认的,如果“身份验证”没有找到,你可以使用:

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

在本质上,这是什么,而神秘的错误消息,说是“流序列的输出不匹配你在其分配到底”,例如:。

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(...)