web-dev-qa-db-ja.com

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は "Cyclic inference"を表示しています。

Javaコンパイラエラー:(52、25)Java:互換性のない型:型変数Rのインスタンスが存在しないため、Java.util.stream.StreamがJava.lang.Stringに準拠しています

33
RobertW

現在のコードはStream<String>を返すため、文字列を返すには追加の手順が必要です。

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

「auth」に一致するCookieがない可能性があるため、Optional<String>を返すことに注意してください。 「auth」が見つからない場合にデフォルトを使用する場合は、次を使用できます。

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

本質的に、このやや不可解なエラーメッセージが言っているのは、「ストリームシーケンスの出力は、最終的に割り当てているものと一致しません」です。

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

.findFirst()。get()したがって、コンパイルをデバッグするには、割り当てを(一時的に)削除するか、他の回答にあるように、収集してStringを返すものを追加します(例:.collect(Collectors.joining(",")))または(.findFirst().get()のようになる)、またはStream<String> stream = list.stream().map(...)のような割り当てを変更する

0
rogerdpack