2014-10-17 39 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(...)