diff --git a/spring-web/src/main/java/org/springframework/http/client/reactive/AbstractClientHttpRequest.java b/spring-web/src/main/java/org/springframework/http/client/reactive/AbstractClientHttpRequest.java index 14346902f2b8..144e0d058da3 100644 --- a/spring-web/src/main/java/org/springframework/http/client/reactive/AbstractClientHttpRequest.java +++ b/spring-web/src/main/java/org/springframework/http/client/reactive/AbstractClientHttpRequest.java @@ -147,8 +147,10 @@ protected Mono doCommit(@Nullable Supplier> writ this.commitActions.add(writeAction); } - List> actions = this.commitActions.stream() - .map(Supplier::get).toList(); + List> actions = new ArrayList<>(this.commitActions.size()); + for (Supplier> commitAction : this.commitActions) { + actions.add(commitAction.get()); + } return Flux.concat(actions).then(); } diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/BodyExtractors.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/BodyExtractors.java index 4baa24b4f14c..0b4d41675586 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/BodyExtractors.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/BodyExtractors.java @@ -194,18 +194,16 @@ private static > S readWithMessageReaders( MediaType contentType = Optional.ofNullable(message.getHeaders().getContentType()) .orElse(MediaType.APPLICATION_OCTET_STREAM); - return context.messageReaders().stream() - .filter(reader -> reader.canRead(elementType, contentType)) - .findFirst() - .map(BodyExtractors::cast) - .map(readerFunction) - .orElseGet(() -> { - List mediaTypes = context.messageReaders().stream() - .flatMap(reader -> reader.getReadableMediaTypes(elementType).stream()) - .toList(); - return errorFunction.apply( - new UnsupportedMediaTypeException(contentType, mediaTypes, elementType)); - }); + for (HttpMessageReader messageReader : context.messageReaders()) { + if (messageReader.canRead(elementType, contentType)) { + return readerFunction.apply(cast(messageReader)); + } + } + List mediaTypes = context.messageReaders().stream() + .flatMap(reader -> reader.getReadableMediaTypes(elementType).stream()) + .toList(); + return errorFunction.apply( + new UnsupportedMediaTypeException(contentType, mediaTypes, elementType)); } private static Mono readToMono(ReactiveHttpInputMessage message, BodyExtractor.Context context, @@ -245,12 +243,13 @@ private static Flux unsupportedErrorHandler( private static HttpMessageReader findReader( ResolvableType elementType, MediaType mediaType, BodyExtractor.Context context) { - return context.messageReaders().stream() - .filter(messageReader -> messageReader.canRead(elementType, mediaType)) - .findFirst() - .map(BodyExtractors::cast) - .orElseThrow(() -> new IllegalStateException( - "No HttpMessageReader for \"" + mediaType + "\" and \"" + elementType + "\"")); + for (HttpMessageReader messageReader : context.messageReaders()) { + if (messageReader.canRead(elementType, mediaType)) { + return cast(messageReader); + } + } + throw new IllegalStateException( + "No HttpMessageReader for \"" + mediaType + "\" and \"" + elementType + "\""); } @SuppressWarnings("unchecked") diff --git a/spring-webflux/src/main/java/org/springframework/web/reactive/function/BodyInserters.java b/spring-webflux/src/main/java/org/springframework/web/reactive/function/BodyInserters.java index 7822ff79ebed..06935a32897e 100644 --- a/spring-webflux/src/main/java/org/springframework/web/reactive/function/BodyInserters.java +++ b/spring-webflux/src/main/java/org/springframework/web/reactive/function/BodyInserters.java @@ -373,12 +373,13 @@ else if (adapter != null) { publisher = Mono.just(body); } MediaType mediaType = outputMessage.getHeaders().getContentType(); - return context.messageWriters().stream() - .filter(messageWriter -> messageWriter.canWrite(bodyType, mediaType)) - .findFirst() - .map(BodyInserters::cast) - .map(writer -> write(publisher, bodyType, mediaType, outputMessage, context, writer)) - .orElseGet(() -> Mono.error(unsupportedError(bodyType, context, mediaType))); + for (HttpMessageWriter messageWriter : context.messageWriters()) { + if (messageWriter.canWrite(bodyType, mediaType)) { + HttpMessageWriter typedMessageWriter = cast(messageWriter); + return write(publisher, bodyType, mediaType, outputMessage, context, typedMessageWriter); + } + } + return Mono.error(unsupportedError(bodyType, context, mediaType)); } private static UnsupportedMediaTypeException unsupportedError(ResolvableType bodyType, @@ -406,12 +407,13 @@ private static Mono write(Publisher input, ResolvableType private static HttpMessageWriter findWriter( BodyInserter.Context context, ResolvableType elementType, @Nullable MediaType mediaType) { - return context.messageWriters().stream() - .filter(messageWriter -> messageWriter.canWrite(elementType, mediaType)) - .findFirst() - .map(BodyInserters::cast) - .orElseThrow(() -> new IllegalStateException( - "No HttpMessageWriter for \"" + mediaType + "\" and \"" + elementType + "\"")); + for (HttpMessageWriter messageWriter : context.messageWriters()) { + if (messageWriter.canWrite(elementType, mediaType)) { + return cast(messageWriter); + } + } + throw new IllegalStateException( + "No HttpMessageWriter for \"" + mediaType + "\" and \"" + elementType + "\""); } @SuppressWarnings("unchecked")