Подтвердить что ты не робот

Предупреждение о циклическом выводе 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

4b9b3361

Ответ 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(...)