Предупреждение о циклическом выводе Java 8
Мое знание операций с списками - это языки скриптов. Поэтому в Java я остановился на чем-то странном в случае поиска cookie с определенным именем.
List<Cookie> cookies = Arrays.asList(request.getCookies());
String auth = cookies.stream()
.filter(c -> c.getName().equals("auth"))
.map(Cookie::getValue);
В методе map
IntelliJ показывает мне "Циклический вывод".
Компилятор Java Ошибка: (52, 25) java: несовместимые типы: экземпляр типа (ов) типа R не существует, так что java.util.stream.Stream соответствует java.lang.String
Ответы
Ответ 1
Ваш текущий код возвращает 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("");
Ответ 2
В сущности, то, что говорит это довольно загадочное сообщение об ошибке, - "вывод последовательности потоков не соответствует тому, что вы назначаете в конце", например:
String s = list.stream().map(s -> s); // this doesn't result in a String...
.findFirst(). Получить()
Поэтому для отладки компиляции удалите присвоение (временно) или, как говорит другой ответ, добавьте что-то, что заставляет его возвращать String, собирая (ex: .collect(Collectors.joining(","))
) или (получая как .findFirst().get()
) или изменяя назначение, например Stream<String> stream = list.stream().map(...)