web-dev-qa-db-fra.com

Java 8 avertissement d'inférence cyclique

Mes connaissances sur les opérations de liste proviennent des langages de script. Donc en Java je me suis arrêté sur quelque chose d'étrange en cas de trouver un cookie avec un nom particulier.

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

Sur la méthode map, IntelliJ me montre "l'inférence cyclique".

Erreur du compilateur Java: (52, 25) Java: types incompatibles: aucune instance de variable (s) de type R n'existe pour que Java.util.stream.Stream se conforme à Java.lang.String

33
RobertW

Votre code actuel renvoie un Stream<String>, vous avez donc besoin d'une étape supplémentaire pour renvoyer une chaîne:

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

Notez qu'il renvoie un Optional<String> car aucun cookie ne correspond à "auth". Si vous souhaitez utiliser une valeur par défaut si "auth" n'est pas trouvé, vous pouvez utiliser:

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

En substance, ce que ce message d'erreur plutôt cryptique dit est "la sortie de la séquence de flux ne correspond pas à ce à quoi vous l'assignez à la fin", par exemple:

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

.findFirst (). get () Donc, pour déboguer la compilation, supprimez l'affectation (temporairement) ou, comme le dit l'autre réponse, ajoutez quelque chose qui lui fait retourner une chaîne en collectant (ex: .collect(Collectors.joining(","))) ou (obtenir comme .findFirst().get()), ou changer l'affectation, comme Stream<String> stream = list.stream().map(...)

0
rogerdpack