2014-10-17 2 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

+2

Хороший вопрос и ответ, но я до сих пор не знаю, что такое циклический вывод! Будет держать Googling, это был первый результат. – JimLohse

+0

@ JimLohse Этот ответ объясняет, что такое циклический вывод: http://stackoverflow.com/a/36258012/3142816. В принципе, тип внутреннего подвыражения не может быть выведен без типа внешнего подвыражения, которое невозможно вывести без типа внутреннего подвыражения – sorianiv

ответ

36

Ваш текущий код возвращает Stream<String>, так что вам нужен дополнительный шаг, чтобы вернуть строку:

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

Обратите внимание, что она возвращает Optional<String>, потому что не может быть никакого Cookie, который соответствует «AUTH». Если вы хотите использовать по умолчанию, если «Auth» не найден вы можете использовать:

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() получаем() так для отладки компиляции, удалить назначение (временно), или, как говорит другой ответ, добавить что-то, что заставляет его возвращать String, собирая (например: .collect(Collectors.joining(","))) или (получая как .findFirst().get()), или измените назначение, например Stream<String> stream = list.stream().map(...)

Смежные вопросы