2014-10-17 18 views
31

Kiến thức về hoạt động danh sách của tôi là từ ngôn ngữ kịch bản. Vì vậy, trong Java tôi dừng lại trên một cái gì đó kỳ lạ trong trường hợp tìm kiếm cookie với tên cụ thể.Cảnh báo suy luận theo chu kỳ Java 8

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

Phương pháp map IntelliJ đang hiển thị cho tôi "Suy luận theo chu kỳ".

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

Khi thông báo cho biết, 'bản đồ' trả về một' Dòng' và không thể được gán cho một 'Chuỗi'. Bạn phải nói cách nó sẽ trở thành một 'Chuỗi' duy nhất. Có lẽ bạn muốn sử dụng '.findAny(). Get()'? – Holger

+2

Câu hỏi và trả lời hay nhưng tôi vẫn không biết suy luận tuần hoàn là gì! Sẽ giữ Googling, đây là kết quả đầu tiên. – JimLohse

+0

@JimLohse Câu trả lời này giải thích suy luận tuần hoàn là gì: http://stackoverflow.com/a/36258012/3142816. Về cơ bản, loại biểu thức con bên trong không thể suy ra mà không có loại biểu diễn con bên ngoài, không thể suy ra mà không có kiểu biểu hiện bên trong – sorianiv

Trả lời

36

mã hiện tại của bạn trả về một Stream<String>, vì vậy bạn cần thêm một bước để trả về một chuỗi:

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

Lưu ý rằng nó sẽ trả về một Optional<String> vì có thể không có Cookie phù hợp với "auth". Nếu bạn muốn sử dụng một mặc định nếu "auth" không tìm thấy bạn có thể sử dụng:

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

Về bản chất, là những gì thông báo lỗi khá khó hiểu này đang nói "đầu ra của chuỗi dòng không phù hợp với những gì bạn được gán nó vào cuối cùng", ví dụ:.

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

.findFirst() get() vì vậy, để gỡ lỗi biên dịch, loại bỏ sự phân công (tạm thời), hoặc, như câu trả lời khác nói, thêm một cái gì đó làm cho nó trả về một String bằng cách thu thập (ví dụ: .collect(Collectors.joining(","))) hoặc (giống như .findFirst().get()), hoặc thay đổi nhiệm vụ, như Stream<String> stream = list.stream().map(...)

Các vấn đề liên quan