You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hc.apache.org by gg...@apache.org on 2022/09/27 15:06:49 UTC

[httpcomponents-client] branch master updated: Use Java 8 features and APIs

This is an automated email from the ASF dual-hosted git repository.

ggregory pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/httpcomponents-client.git


The following commit(s) were added to refs/heads/master by this push:
     new 7ac0a028f Use Java 8 features and APIs
7ac0a028f is described below

commit 7ac0a028f811243c09f44871c0dddfbdb055dc7b
Author: Gary Gregory <ga...@gmail.com>
AuthorDate: Tue Sep 27 11:06:42 2022 -0400

    Use Java 8 features and APIs
---
 .../http/cache/HttpAsyncCacheStorageAdaptor.java   |  3 +-
 .../hc/client5/http/cache/HttpCacheEntry.java      |  5 +-
 .../AbstractSerializingAsyncCacheStorage.java      |  7 +--
 .../cache/AbstractSerializingCacheStorage.java     |  7 +--
 .../http/impl/cache/BasicHttpAsyncCache.java       |  6 +-
 .../impl/cache/ByteArrayCacheEntrySerializer.java  |  7 +--
 .../hc/client5/http/impl/cache/CachingExec.java    |  5 +-
 .../impl/cache/DefaultAsyncCacheInvalidator.java   | 10 +---
 .../http/impl/cache/DefaultCacheInvalidator.java   |  4 +-
 .../cache/HttpByteArrayCacheEntrySerializer.java   |  8 +--
 .../http/impl/cache/ManagedHttpCacheStorage.java   |  4 +-
 .../impl/cache/ResponseProtocolCompliance.java     |  4 +-
 .../cache/ehcache/EhcacheHttpCacheStorage.java     | 13 ++---
 ...HttpByteArrayCacheEntrySerializerTestUtils.java |  5 +-
 .../org/apache/hc/client5/http/fluent/Request.java |  6 +-
 .../client5/http/examples/fluent/FluentAsync.java  | 37 ++++++------
 .../org/apache/hc/client5/http/ContextBuilder.java |  4 +-
 .../http/async/methods/SimpleHttpRequest.java      |  6 +-
 .../http/async/methods/SimpleHttpResponse.java     |  7 +--
 .../apache/hc/client5/http/config/TlsConfig.java   | 18 +++---
 .../hc/client5/http/cookie/BasicCookieStore.java   | 66 ++++++++--------------
 .../apache/hc/client5/http/cookie/CookieStore.java | 26 ++++++---
 .../http/entity/mime/FormBodyPartBuilder.java      |  4 +-
 .../http/entity/mime/MultipartPartBuilder.java     |  4 +-
 .../apache/hc/client5/http/impl/RequestCopier.java |  7 +--
 .../hc/client5/http/impl/RequestSupport.java       |  4 +-
 .../client5/http/impl/async/AsyncProtocolExec.java | 13 +----
 .../hc/client5/http/impl/auth/BasicScheme.java     |  4 +-
 .../hc/client5/http/impl/auth/DigestScheme.java    |  4 +-
 .../client5/http/impl/auth/HttpAuthenticator.java  |  8 +--
 .../http/impl/classic/ClassicRequestCopier.java    |  7 +--
 .../http/impl/classic/HttpClientBuilder.java       |  5 +-
 .../hc/client5/http/impl/classic/ProtocolExec.java |  6 +-
 .../client5/http/impl/cookie/CookieSpecBase.java   |  7 +--
 .../io/DefaultManagedHttpClientConnection.java     | 12 +---
 .../http/impl/routing/BasicRouteDirector.java      |  2 +-
 .../impl/routing/SystemDefaultRoutePlanner.java    |  4 +-
 .../client5/http/protocol/RequestAddCookies.java   | 11 +---
 .../http/protocol/RequestDefaultHeaders.java       |  6 +-
 .../hc/client5/http/psl/PublicSuffixMatcher.java   | 42 ++++++--------
 .../http/ssl/SSLConnectionSocketFactory.java       |  7 +--
 .../hc/client5/http/ssl/TlsSessionValidator.java   |  4 +-
 .../client5/http/examples/ClientCustomContext.java |  6 +-
 43 files changed, 155 insertions(+), 270 deletions(-)

diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/cache/HttpAsyncCacheStorageAdaptor.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/cache/HttpAsyncCacheStorageAdaptor.java
index 2178a62bb..df0650852 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/cache/HttpAsyncCacheStorageAdaptor.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/cache/HttpAsyncCacheStorageAdaptor.java
@@ -70,8 +70,7 @@ public final class HttpAsyncCacheStorageAdaptor implements HttpAsyncCacheStorage
         Args.notEmpty(key, "Key");
         Args.notNull(callback, "Callback");
         try {
-            final HttpCacheEntry entry = cacheStorage.getEntry(key);
-            callback.completed(entry);
+            callback.completed(cacheStorage.getEntry(key));
         } catch (final Exception ex) {
             callback.failed(ex);
         }
diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/cache/HttpCacheEntry.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/cache/HttpCacheEntry.java
index 11432ac17..93df2b12a 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/cache/HttpCacheEntry.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/cache/HttpCacheEntry.java
@@ -243,12 +243,11 @@ public class HttpCacheEntry implements MessageHeaders, Serializable {
     @Override
     public Header[] getHeaders() {
         final HeaderGroup filteredHeaders = new HeaderGroup();
-        for (final Iterator<Header> iterator = responseHeaders.headerIterator(); iterator.hasNext();) {
-            final Header header = iterator.next();
+        responseHeaders.headerIterator().forEachRemaining(header -> {
             if (!REQUEST_METHOD_HEADER_NAME.equals(header.getName())) {
                 filteredHeaders.addHeader(header);
             }
-        }
+        });
         return filteredHeaders.getHeaders();
     }
 
diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/AbstractSerializingAsyncCacheStorage.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/AbstractSerializingAsyncCacheStorage.java
index 126192b1f..7fe3f6db9 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/AbstractSerializingAsyncCacheStorage.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/AbstractSerializingAsyncCacheStorage.java
@@ -26,12 +26,12 @@
  */
 package org.apache.hc.client5.http.impl.cache;
 
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
 
 import org.apache.hc.client5.http.cache.HttpAsyncCacheStorage;
 import org.apache.hc.client5.http.cache.HttpCacheCASOperation;
@@ -239,10 +239,7 @@ public abstract class AbstractSerializingAsyncCacheStorage<T, CAS> implements Ht
         Args.notNull(keys, "Storage keys");
         Args.notNull(callback, "Callback");
         try {
-            final List<String> storageKeys = new ArrayList<>(keys.size());
-            for (final String key: keys) {
-                storageKeys.add(digestToStorageKey(key));
-            }
+            final List<String> storageKeys = keys.stream().map(this::digestToStorageKey).collect(Collectors.toList());
             return bulkRestore(storageKeys, new FutureCallback<Map<String, T>>() {
 
                 @Override
diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/AbstractSerializingCacheStorage.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/AbstractSerializingCacheStorage.java
index c0b683a01..1b61396f5 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/AbstractSerializingCacheStorage.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/AbstractSerializingCacheStorage.java
@@ -26,11 +26,11 @@
  */
 package org.apache.hc.client5.http.impl.cache;
 
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import org.apache.hc.client5.http.cache.HttpCacheCASOperation;
 import org.apache.hc.client5.http.cache.HttpCacheEntry;
@@ -135,10 +135,7 @@ public abstract class AbstractSerializingCacheStorage<T, CAS> implements HttpCac
     @Override
     public final Map<String, HttpCacheEntry> getEntries(final Collection<String> keys) throws ResourceIOException {
         Args.notNull(keys, "Storage keys");
-        final List<String> storageKeys = new ArrayList<>(keys.size());
-        for (final String key: keys) {
-            storageKeys.add(digestToStorageKey(key));
-        }
+        final List<String> storageKeys = keys.stream().map(this::digestToStorageKey).collect(Collectors.toList());
         final Map<String, T> storageObjectMap = bulkRestore(storageKeys);
         final Map<String, HttpCacheEntry> resultMap = new HashMap<>();
         for (final String key: keys) {
diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/BasicHttpAsyncCache.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/BasicHttpAsyncCache.java
index d89def8a5..36ffb7c00 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/BasicHttpAsyncCache.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/BasicHttpAsyncCache.java
@@ -537,14 +537,12 @@ class BasicHttpAsyncCache implements HttpAsyncCache {
 
                                 @Override
                                 public void completed(final Map<String, HttpCacheEntry> resultMap) {
-                                    for (final Map.Entry<String, HttpCacheEntry> resultMapEntry : resultMap.entrySet()) {
-                                        final String cacheKey = resultMapEntry.getKey();
-                                        final HttpCacheEntry cacheEntry = resultMapEntry.getValue();
+                                    resultMap.forEach((cacheKey, cacheEntry) -> {
                                         final Header etagHeader = cacheEntry.getFirstHeader(HeaderConstants.ETAG);
                                         if (etagHeader != null) {
                                             variants.put(etagHeader.getValue(), new Variant(cacheKey, cacheEntry));
                                         }
-                                    }
+                                    });
                                     callback.completed(variants);
                                 }
 
diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/ByteArrayCacheEntrySerializer.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/ByteArrayCacheEntrySerializer.java
index 1bebc95a0..aba1dc87e 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/ByteArrayCacheEntrySerializer.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/ByteArrayCacheEntrySerializer.java
@@ -117,12 +117,7 @@ public final class ByteArrayCacheEntrySerializer implements HttpCacheEntrySerial
 
         // visible for testing
         static boolean isAllowedClassName(final String className) {
-            for (final Pattern allowedClassPattern : ALLOWED_CLASS_PATTERNS) {
-                if (allowedClassPattern.matcher(className).matches()) {
-                    return true;
-                }
-            }
-            return false;
+            return ALLOWED_CLASS_PATTERNS.stream().anyMatch(pattern -> pattern.matcher(className).matches());
         }
 
     }
diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CachingExec.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CachingExec.java
index 5b437eec3..2f3e8ad89 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CachingExec.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/CachingExec.java
@@ -29,7 +29,6 @@ package org.apache.hc.client5.http.impl.cache;
 import java.io.IOException;
 import java.io.InputStream;
 import java.time.Instant;
-import java.util.Iterator;
 import java.util.Map;
 import java.util.concurrent.ScheduledExecutorService;
 
@@ -206,9 +205,7 @@ class CachingExec extends CachingExecBase implements ExecChainHandler {
             return null;
         }
         final ClassicHttpResponse response = new BasicClassicHttpResponse(cacheResponse.getCode(), cacheResponse.getReasonPhrase());
-        for (final Iterator<Header> it = cacheResponse.headerIterator(); it.hasNext(); ) {
-            response.addHeader(it.next());
-        }
+        cacheResponse.headerIterator().forEachRemaining(response::addHeader);
         response.setVersion(cacheResponse.getVersion() != null ? cacheResponse.getVersion() : HttpVersion.DEFAULT);
         final SimpleBody body = cacheResponse.getBody();
         if (body != null) {
diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/DefaultAsyncCacheInvalidator.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/DefaultAsyncCacheInvalidator.java
index 952659516..670441103 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/DefaultAsyncCacheInvalidator.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/DefaultAsyncCacheInvalidator.java
@@ -112,9 +112,7 @@ public class DefaultAsyncCacheInvalidator extends CacheInvalidatorBase implement
                         if (LOG.isDebugEnabled()) {
                             LOG.debug("Invalidating parentEntry cache entry with key {}", cacheKey);
                         }
-                        for (final String variantURI : parentEntry.getVariantMap().values()) {
-                            removeEntry(storage, variantURI);
-                        }
+                        parentEntry.getVariantMap().values().forEach(variantURI -> removeEntry(storage, variantURI));
                         removeEntry(storage, cacheKey);
                     }
                     if (uri != null) {
@@ -233,15 +231,13 @@ public class DefaultAsyncCacheInvalidator extends CacheInvalidatorBase implement
 
                         @Override
                         public void completed(final Map<String, HttpCacheEntry> resultMap) {
-                            for (final Map.Entry<String, HttpCacheEntry> resultEntry: resultMap.entrySet()) {
+                            resultMap.forEach((key, entry) -> {
                                 // do not invalidate if response is strictly older than entry
                                 // or if the etags match
-                                final String key = resultEntry.getKey();
-                                final HttpCacheEntry entry = resultEntry.getValue();
                                 if (!responseDateOlderThanEntryDate(response, entry) && responseAndEntryEtagsDiffer(response, entry)) {
                                     removeEntry(storage, key);
                                 }
-                            }
+                            });
                             callback.completed(Boolean.TRUE);
                         }
 
diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/DefaultCacheInvalidator.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/DefaultCacheInvalidator.java
index 0ac340d91..b51a24110 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/DefaultCacheInvalidator.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/DefaultCacheInvalidator.java
@@ -96,9 +96,7 @@ public class DefaultCacheInvalidator extends CacheInvalidatorBase implements Htt
                 if (LOG.isDebugEnabled()) {
                     LOG.debug("Invalidating parent cache entry with key {}", cacheKey);
                 }
-                for (final String variantURI : parent.getVariantMap().values()) {
-                    removeEntry(storage, variantURI);
-                }
+                parent.getVariantMap().values().forEach(variantURI -> removeEntry(storage, variantURI));
                 removeEntry(storage, cacheKey);
             }
             if (uri != null) {
diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/HttpByteArrayCacheEntrySerializer.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/HttpByteArrayCacheEntrySerializer.java
index ce82e73f1..bf2734334 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/HttpByteArrayCacheEntrySerializer.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/HttpByteArrayCacheEntrySerializer.java
@@ -261,11 +261,11 @@ public class HttpByteArrayCacheEntrySerializer implements HttpCacheEntrySerializ
         // Encode these so map entries are stored in a pair of headers, one for key and one for value.
         // Header keys look like: {Accept-Encoding=gzip}
         // And header values like: {Accept-Encoding=gzip}https://example.com:1234/foo
-        for (final Map.Entry<String, String> entry : httpCacheEntry.getContent().getVariantMap().entrySet()) {
+        httpCacheEntry.getContent().getVariantMap().forEach((k, v) -> {
             // Headers are ordered
-            httpResponse.addHeader(SC_HEADER_NAME_VARIANT_MAP_KEY, entry.getKey());
-            httpResponse.addHeader(SC_HEADER_NAME_VARIANT_MAP_VALUE, entry.getValue());
-        }
+            httpResponse.addHeader(SC_HEADER_NAME_VARIANT_MAP_KEY, k);
+            httpResponse.addHeader(SC_HEADER_NAME_VARIANT_MAP_VALUE, v);
+        });
     }
 
     /**
diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/ManagedHttpCacheStorage.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/ManagedHttpCacheStorage.java
index 917e71d81..cdfc3cbb1 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/ManagedHttpCacheStorage.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/ManagedHttpCacheStorage.java
@@ -182,9 +182,7 @@ public class ManagedHttpCacheStorage implements HttpCacheStorage, Closeable {
         if (compareAndSet()) {
             synchronized (this) {
                 this.entries.clear();
-                for (final ResourceReference ref: this.resources) {
-                    ref.getResource().dispose();
-                }
+                this.resources.forEach(ref -> ref.getResource().dispose());
                 this.resources.clear();
                 while (this.morque.poll() != null) {
                 }
diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/ResponseProtocolCompliance.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/ResponseProtocolCompliance.java
index cd051afc5..ce4465513 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/ResponseProtocolCompliance.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/ResponseProtocolCompliance.java
@@ -146,9 +146,7 @@ class ResponseProtocolCompliance {
             return;
         }
         response.removeHeaders(HttpHeaders.CONTENT_ENCODING);
-        for (final Header h : newHeaders) {
-            response.addHeader(h);
-        }
+        newHeaders.forEach(response::addHeader);
     }
 
     private void ensure206ContainsDateHeader(final HttpResponse response) {
diff --git a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/ehcache/EhcacheHttpCacheStorage.java b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/ehcache/EhcacheHttpCacheStorage.java
index 1053bdba2..2bf201920 100644
--- a/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/ehcache/EhcacheHttpCacheStorage.java
+++ b/httpclient5-cache/src/main/java/org/apache/hc/client5/http/impl/cache/ehcache/EhcacheHttpCacheStorage.java
@@ -27,8 +27,9 @@
 package org.apache.hc.client5.http.impl.cache.ehcache;
 
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.Map;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 import org.apache.hc.client5.http.cache.HttpCacheEntrySerializer;
 import org.apache.hc.client5.http.cache.HttpCacheStorageEntry;
@@ -137,14 +138,8 @@ public class EhcacheHttpCacheStorage<T> extends AbstractSerializingCacheStorage<
 
     @Override
     protected Map<String, T> bulkRestore(final Collection<String> storageKeys) throws ResourceIOException {
-        final Map<String, T> resultMap = new HashMap<>();
-        for (final String storageKey: storageKeys) {
-            final T storageObject = cache.get(storageKey);
-            if (storageObject != null) {
-                resultMap.put(storageKey, storageObject);
-            }
-        }
-        return resultMap;
+        return storageKeys.stream().filter(cache::containsKey)
+                .collect(Collectors.toMap(Function.identity(), cache::get));
     }
 
 }
diff --git a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/HttpByteArrayCacheEntrySerializerTestUtils.java b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/HttpByteArrayCacheEntrySerializerTestUtils.java
index 950585f17..e4be347a8 100644
--- a/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/HttpByteArrayCacheEntrySerializerTestUtils.java
+++ b/httpclient5-cache/src/test/java/org/apache/hc/client5/http/impl/cache/HttpByteArrayCacheEntrySerializerTestUtils.java
@@ -226,9 +226,8 @@ class HttpByteArrayCacheEntrySerializerTestUtils {
         assertEquals(expectedContent.getStatus(), actualContent.getStatus());
 
         assertArrayEquals(expectedContent.getVariantMap().keySet().toArray(), actualContent.getVariantMap().keySet().toArray());
-        for (final String key : expectedContent.getVariantMap().keySet()) {
-            assertEquals(expectedContent.getVariantMap().get(key), actualContent.getVariantMap().get(key), "Expected same variantMap values for key '" + key + "'");
-        }
+        expectedContent.getVariantMap().keySet().forEach(key -> assertEquals(expectedContent.getVariantMap().get(key),
+                actualContent.getVariantMap().get(key), "Expected same variantMap values for key '" + key + "'"));
 
         // Verify that the same headers are present on the expected and actual content.
         for(final Header expectedHeader: expectedContent.getHeaders()) {
diff --git a/httpclient5-fluent/src/main/java/org/apache/hc/client5/http/fluent/Request.java b/httpclient5-fluent/src/main/java/org/apache/hc/client5/http/fluent/Request.java
index 8c06c6267..6f501b8e6 100644
--- a/httpclient5-fluent/src/main/java/org/apache/hc/client5/http/fluent/Request.java
+++ b/httpclient5-fluent/src/main/java/org/apache/hc/client5/http/fluent/Request.java
@@ -358,11 +358,9 @@ public class Request {
         return this;
     }
 
-    public Request bodyForm(final Iterable <? extends NameValuePair> formParams, final Charset charset) {
+    public Request bodyForm(final Iterable<? extends NameValuePair> formParams, final Charset charset) {
         final List<NameValuePair> paramList = new ArrayList<>();
-        for (final NameValuePair param : formParams) {
-            paramList.add(param);
-        }
+        formParams.forEach(paramList::add);
         final ContentType contentType = charset != null ?
                 ContentType.APPLICATION_FORM_URLENCODED.withCharset(charset) : ContentType.APPLICATION_FORM_URLENCODED;
         final String s = WWWFormCodec.format(paramList, contentType.getCharset());
diff --git a/httpclient5-fluent/src/test/java/org/apache/hc/client5/http/examples/fluent/FluentAsync.java b/httpclient5-fluent/src/test/java/org/apache/hc/client5/http/examples/fluent/FluentAsync.java
index e73fa9abd..106680308 100644
--- a/httpclient5-fluent/src/test/java/org/apache/hc/client5/http/examples/fluent/FluentAsync.java
+++ b/httpclient5-fluent/src/test/java/org/apache/hc/client5/http/examples/fluent/FluentAsync.java
@@ -26,7 +26,9 @@
  */
 package org.apache.hc.client5.http.examples.fluent;
 
+import java.util.Arrays;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.Queue;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
@@ -49,38 +51,35 @@ public class FluentAsync {
         final ExecutorService threadpool = Executors.newFixedThreadPool(2);
         final Async async = Async.newInstance().use(threadpool);
 
-        final Request[] requests = new Request[] {
+        final List<Request> requests = Arrays.asList(
                 Request.get("http://www.google.com/"),
                 Request.get("http://www.yahoo.com/"),
                 Request.get("http://www.apache.org/"),
                 Request.get("http://www.apple.com/")
-        };
+        );
 
 
         final Queue<Future<Content>> queue = new LinkedList<>();
         // Execute requests asynchronously
-        for (final Request request: requests) {
-            final Future<Content> future = async.execute(request, new FutureCallback<Content>() {
+        requests.forEach(request -> queue.add(async.execute(request, new FutureCallback<Content>() {
 
-                @Override
-                public void failed(final Exception ex) {
-                    System.out.println(ex.getMessage() + ": " + request);
-                }
+            @Override
+            public void failed(final Exception ex) {
+                System.out.println(ex.getMessage() + ": " + request);
+            }
 
-                @Override
-                public void completed(final Content content) {
-                    System.out.println("Request completed: " + request);
-                }
+            @Override
+            public void completed(final Content content) {
+                System.out.println("Request completed: " + request);
+            }
 
-                @Override
-                public void cancelled() {
-                }
+            @Override
+            public void cancelled() {
+            }
 
-            });
-            queue.add(future);
-        }
+        })));
 
-        while(!queue.isEmpty()) {
+        while (!queue.isEmpty()) {
             final Future<Content> future = queue.remove();
             try {
                 future.get();
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/ContextBuilder.java b/httpclient5/src/main/java/org/apache/hc/client5/http/ContextBuilder.java
index 7e57753a9..4d412facc 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/ContextBuilder.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/ContextBuilder.java
@@ -124,9 +124,7 @@ public class ContextBuilder {
         context.setCredentialsProvider(credentialsProvider);
         context.setAuthCache(authCache);
         if (authSchemeMap != null) {
-            for (final Map.Entry<HttpHost, AuthScheme> entry : authSchemeMap.entrySet()) {
-                context.resetAuthExchange(entry.getKey(), entry.getValue());
-            }
+            authSchemeMap.forEach(context::resetAuthExchange);
         }
         return context;
     }
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/async/methods/SimpleHttpRequest.java b/httpclient5/src/main/java/org/apache/hc/client5/http/async/methods/SimpleHttpRequest.java
index 61d3a9f21..39a4f74d8 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/async/methods/SimpleHttpRequest.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/async/methods/SimpleHttpRequest.java
@@ -28,10 +28,8 @@
 package org.apache.hc.client5.http.async.methods;
 
 import java.net.URI;
-import java.util.Iterator;
 
 import org.apache.hc.core5.http.ContentType;
-import org.apache.hc.core5.http.Header;
 import org.apache.hc.core5.http.HttpHost;
 import org.apache.hc.core5.http.HttpRequest;
 import org.apache.hc.core5.http.Method;
@@ -100,9 +98,7 @@ public final class SimpleHttpRequest extends ConfigurableHttpRequest {
         Args.notNull(original, "HTTP request");
         final SimpleHttpRequest copy = new SimpleHttpRequest(original.getMethod(), original.getRequestUri());
         copy.setVersion(original.getVersion());
-        for (final Iterator<Header> it = original.headerIterator(); it.hasNext(); ) {
-            copy.addHeader(it.next());
-        }
+        original.headerIterator().forEachRemaining(copy::addHeader);
         copy.setScheme(original.getScheme());
         copy.setAuthority(original.getAuthority());
         return copy;
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/async/methods/SimpleHttpResponse.java b/httpclient5/src/main/java/org/apache/hc/client5/http/async/methods/SimpleHttpResponse.java
index 78416a9e7..e2dcf4df0 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/async/methods/SimpleHttpResponse.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/async/methods/SimpleHttpResponse.java
@@ -27,10 +27,7 @@
 
 package org.apache.hc.client5.http.async.methods;
 
-import java.util.Iterator;
-
 import org.apache.hc.core5.http.ContentType;
-import org.apache.hc.core5.http.Header;
 import org.apache.hc.core5.http.HttpResponse;
 import org.apache.hc.core5.http.message.BasicHttpResponse;
 import org.apache.hc.core5.util.Args;
@@ -66,9 +63,7 @@ public final class SimpleHttpResponse extends BasicHttpResponse {
         Args.notNull(original, "HTTP response");
         final SimpleHttpResponse copy = new SimpleHttpResponse(original.getCode());
         copy.setVersion(original.getVersion());
-        for (final Iterator<Header> it = original.headerIterator(); it.hasNext(); ) {
-            copy.addHeader(it.next());
-        }
+        original.headerIterator().forEachRemaining(copy::addHeader);
         return copy;
     }
 
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/config/TlsConfig.java b/httpclient5/src/main/java/org/apache/hc/client5/http/config/TlsConfig.java
index 8aba28f22..6a497be69 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/config/TlsConfig.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/config/TlsConfig.java
@@ -28,7 +28,9 @@
 package org.apache.hc.client5.http.config;
 
 import java.util.Arrays;
+import java.util.Objects;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Stream;
 
 import org.apache.hc.core5.annotation.Contract;
 import org.apache.hc.core5.annotation.ThreadingBehavior;
@@ -174,13 +176,15 @@ public class TlsConfig implements Cloneable {
          * </p>
          */
         public Builder setSupportedProtocols(final TLS... supportedProtocols) {
-            this.supportedProtocols = new String[supportedProtocols.length];
-            for (int i = 0; i < supportedProtocols.length; i++) {
-                final TLS protocol = supportedProtocols[i];
-                if (protocol != null) {
-                    this.supportedProtocols[i] = protocol.id;
-                }
-            }
+//            this.supportedProtocols = new String[supportedProtocols.length];
+//            for (int i = 0; i < supportedProtocols.length; i++) {
+//                final TLS protocol = supportedProtocols[i];
+//                if (protocol != null) {
+//                    this.supportedProtocols[i] = protocol.id;
+//                }
+//            }
+            this.supportedProtocols = Stream.of(supportedProtocols).filter(Objects::nonNull).map(p -> p.id)
+                    .toArray(String[]::new);
             return this;
         }
 
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/BasicCookieStore.java b/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/BasicCookieStore.java
index 38b972c57..91945bc6a 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/BasicCookieStore.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/BasicCookieStore.java
@@ -32,11 +32,11 @@ import java.io.Serializable;
 import java.time.Instant;
 import java.util.ArrayList;
 import java.util.Date;
-import java.util.Iterator;
 import java.util.List;
 import java.util.TreeSet;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
+import java.util.stream.Stream;
 
 import org.apache.hc.core5.annotation.Contract;
 import org.apache.hc.core5.annotation.ThreadingBehavior;
@@ -60,13 +60,6 @@ public class BasicCookieStore implements CookieStore, Serializable {
         this.lock = new ReentrantReadWriteLock();
     }
 
-    private void readObject(final ObjectInputStream stream) throws IOException, ClassNotFoundException {
-        stream.defaultReadObject();
-
-        /* Reinstantiate transient fields. */
-        this.lock = new ReentrantReadWriteLock();
-    }
-
     /**
      * Adds an {@link Cookie HTTP cookie}, replacing any existing equivalent cookies.
      * If the given cookie has already expired it will not be added, but existing
@@ -105,26 +98,20 @@ public class BasicCookieStore implements CookieStore, Serializable {
      */
     public void addCookies(final Cookie[] cookies) {
         if (cookies != null) {
-            for (final Cookie cookie : cookies) {
-                this.addCookie(cookie);
-            }
+            Stream.of(cookies).forEach(this::addCookie);
         }
     }
 
     /**
-     * Returns an immutable array of {@link Cookie cookies} that this HTTP
-     * state currently contains.
-     *
-     * @return an array of {@link Cookie cookies}.
+     * Clears all cookies.
      */
     @Override
-    public List<Cookie> getCookies() {
-        lock.readLock().lock();
+    public void clear() {
+        lock.writeLock().lock();
         try {
-            //create defensive copy so it won't be concurrently modified
-            return new ArrayList<>(cookies);
+            cookies.clear();
         } finally {
-            lock.readLock().unlock();
+            lock.writeLock().unlock();
         }
     }
 
@@ -144,14 +131,7 @@ public class BasicCookieStore implements CookieStore, Serializable {
         }
         lock.writeLock().lock();
         try {
-            boolean removed = false;
-            for (final Iterator<Cookie> it = cookies.iterator(); it.hasNext(); ) {
-                if (it.next().isExpired(date)) {
-                    it.remove();
-                    removed = true;
-                }
-            }
-            return removed;
+            return cookies.removeIf(c -> c.isExpired(date));
         } finally {
             lock.writeLock().unlock();
         }
@@ -172,32 +152,36 @@ public class BasicCookieStore implements CookieStore, Serializable {
         }
         lock.writeLock().lock();
         try {
-            boolean removed = false;
-            for (final Iterator<Cookie> it = cookies.iterator(); it.hasNext(); ) {
-                if (it.next().isExpired(instant)) {
-                    it.remove();
-                    removed = true;
-                }
-            }
-            return removed;
+            return cookies.removeIf(c -> c.isExpired(instant));
         } finally {
             lock.writeLock().unlock();
         }
     }
 
     /**
-     * Clears all cookies.
+     * Returns an immutable array of {@link Cookie cookies} that this HTTP
+     * state currently contains.
+     *
+     * @return an array of {@link Cookie cookies}.
      */
     @Override
-    public void clear() {
-        lock.writeLock().lock();
+    public List<Cookie> getCookies() {
+        lock.readLock().lock();
         try {
-            cookies.clear();
+            //create defensive copy so it won't be concurrently modified
+            return new ArrayList<>(cookies);
         } finally {
-            lock.writeLock().unlock();
+            lock.readLock().unlock();
         }
     }
 
+    private void readObject(final ObjectInputStream stream) throws IOException, ClassNotFoundException {
+        stream.defaultReadObject();
+
+        /* Reinstantiate transient fields. */
+        this.lock = new ReentrantReadWriteLock();
+    }
+
     @Override
     public String toString() {
         lock.readLock().lock();
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/CookieStore.java b/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/CookieStore.java
index 543e6c5b7..86292277e 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/CookieStore.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/cookie/CookieStore.java
@@ -28,6 +28,7 @@ package org.apache.hc.client5.http.cookie;
 
 import java.time.Instant;
 import java.util.Date;
+import java.util.Iterator;
 import java.util.List;
 
 /**
@@ -36,7 +37,7 @@ import java.util.List;
  *
  * @since 4.0
  */
-public interface CookieStore {
+public interface CookieStore extends Iterable<Cookie> {
 
     /**
      * Adds an {@link Cookie}, replacing any existing equivalent cookies.
@@ -48,11 +49,9 @@ public interface CookieStore {
     void addCookie(Cookie cookie);
 
     /**
-     * Returns all cookies contained in this store.
-     *
-     * @return all cookies
+     * Clears all cookies.
      */
-    List<Cookie> getCookies();
+    void clear();
 
     /**
      * Removes all of {@link Cookie}s in this store that have expired by
@@ -76,8 +75,21 @@ public interface CookieStore {
     }
 
     /**
-     * Clears all cookies.
+     * Returns all cookies contained in this store.
+     *
+     * @return all cookies
      */
-    void clear();
+    List<Cookie> getCookies();
+
+    /**
+     * Iterates all cookies in this store.
+     *
+     * @since 5.2
+     */
+    @Override
+    default Iterator<Cookie> iterator() {
+        return getCookies().iterator();
+    }
+
 
 }
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/entity/mime/FormBodyPartBuilder.java b/httpclient5/src/main/java/org/apache/hc/client5/http/entity/mime/FormBodyPartBuilder.java
index 72405cfc8..ef2e290e6 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/entity/mime/FormBodyPartBuilder.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/entity/mime/FormBodyPartBuilder.java
@@ -107,9 +107,7 @@ public class FormBodyPartBuilder {
         Asserts.notNull(this.body, "Content body");
         final Header headerCopy = new Header();
         final List<MimeField> fields = this.header.getFields();
-        for (final MimeField field: fields) {
-            headerCopy.addField(field);
-        }
+        fields.forEach(headerCopy::addField);
         if (headerCopy.getField(MimeConsts.CONTENT_DISPOSITION) == null) {
             final List<NameValuePair> fieldParameters = new ArrayList<>();
             fieldParameters.add(new BasicNameValuePair(MimeConsts.FIELD_PARAM_NAME, this.name));
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/entity/mime/MultipartPartBuilder.java b/httpclient5/src/main/java/org/apache/hc/client5/http/entity/mime/MultipartPartBuilder.java
index eeda5cdb8..85dc1ba64 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/entity/mime/MultipartPartBuilder.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/entity/mime/MultipartPartBuilder.java
@@ -94,9 +94,7 @@ public class MultipartPartBuilder {
         Asserts.notNull(this.body, "Content body");
         final Header headerCopy = new Header();
         final List<MimeField> fields = this.header.getFields();
-        for (final MimeField field: fields) {
-            headerCopy.addField(field);
-        }
+        fields.forEach(headerCopy::addField);
         if (headerCopy.getField(MimeConsts.CONTENT_TYPE) == null) {
             final ContentType contentType;
             if (body instanceof AbstractContentBody) {
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/RequestCopier.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/RequestCopier.java
index 7364a92f1..f8498f167 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/RequestCopier.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/RequestCopier.java
@@ -26,9 +26,6 @@
  */
 package org.apache.hc.client5.http.impl;
 
-import java.util.Iterator;
-
-import org.apache.hc.core5.http.Header;
 import org.apache.hc.core5.http.HttpRequest;
 import org.apache.hc.core5.http.message.BasicHttpRequest;
 
@@ -53,9 +50,7 @@ public final class RequestCopier implements MessageCopier<HttpRequest> {
         copy.setScheme(original.getScheme());
         copy.setAuthority(original.getAuthority());
         copy.setVersion(original.getVersion());
-        for (final Iterator<Header> it = original.headerIterator(); it.hasNext(); ) {
-            copy.addHeader(it.next());
-        }
+        original.headerIterator().forEachRemaining(copy::addHeader);
         return copy;
     }
 
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/RequestSupport.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/RequestSupport.java
index 50e879f38..9fe318bc6 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/RequestSupport.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/RequestSupport.java
@@ -60,10 +60,10 @@ public final class RequestSupport {
             } else {
                 final StringBuilder buf = new StringBuilder();
                 buf.append('/');
-                for (final String pathSegment : pathSegments) {
+                pathSegments.forEach(pathSegment -> {
                     PercentCodec.encode(buf, pathSegment, StandardCharsets.US_ASCII);
                     buf.append('/');
-                }
+                });
                 return buf.toString();
             }
         } catch (final URISyntaxException ex) {
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/AsyncProtocolExec.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/AsyncProtocolExec.java
index 2f696bbd5..569e91ed1 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/AsyncProtocolExec.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/AsyncProtocolExec.java
@@ -27,7 +27,6 @@
 package org.apache.hc.client5.http.impl.async;
 
 import java.io.IOException;
-import java.util.Iterator;
 import java.util.concurrent.atomic.AtomicBoolean;
 
 import org.apache.hc.client5.http.AuthenticationStrategy;
@@ -49,7 +48,6 @@ import org.apache.hc.core5.annotation.Contract;
 import org.apache.hc.core5.annotation.Internal;
 import org.apache.hc.core5.annotation.ThreadingBehavior;
 import org.apache.hc.core5.http.EntityDetails;
-import org.apache.hc.core5.http.Header;
 import org.apache.hc.core5.http.HttpException;
 import org.apache.hc.core5.http.HttpHeaders;
 import org.apache.hc.core5.http.HttpHost;
@@ -265,9 +263,7 @@ public final class AsyncProtocolExec implements AsyncExecChainHandler {
                         // Reset request headers
                         final HttpRequest original = scope.originalRequest;
                         request.setHeaders();
-                        for (final Iterator<Header> it = original.headerIterator(); it.hasNext(); ) {
-                            request.addHeader(it.next());
-                        }
+                        original.headerIterator().forEachRemaining(request::addHeader);
                         try {
                             if (entityProducer != null) {
                                 entityProducer.releaseResources();
@@ -286,11 +282,8 @@ public final class AsyncProtocolExec implements AsyncExecChainHandler {
             @Override
             public void failed(final Exception cause) {
                 if (cause instanceof IOException || cause instanceof RuntimeException) {
-                    for (final AuthExchange authExchange : clientContext.getAuthExchanges().values()) {
-                        if (authExchange.isConnectionBased()) {
-                            authExchange.reset();
-                        }
-                    }
+                    clientContext.getAuthExchanges().values().stream().filter(AuthExchange::isConnectionBased)
+                            .forEach(AuthExchange::reset);
                 }
                 asyncExecCallback.failed(cause);
             }
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/BasicScheme.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/BasicScheme.java
index 87d11448c..f518ee79e 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/BasicScheme.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/BasicScheme.java
@@ -133,9 +133,7 @@ public class BasicScheme implements AuthScheme, Serializable {
         this.paramMap.clear();
         final List<NameValuePair> params = authChallenge.getParams();
         if (params != null) {
-            for (final NameValuePair param: params) {
-                this.paramMap.put(param.getName().toLowerCase(Locale.ROOT), param.getValue());
-            }
+            params.forEach(param -> this.paramMap.put(param.getName().toLowerCase(Locale.ROOT), param.getValue()));
         }
         this.complete = true;
     }
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/DigestScheme.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/DigestScheme.java
index ff98ab36a..4a9609340 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/DigestScheme.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/DigestScheme.java
@@ -162,9 +162,7 @@ public class DigestScheme implements AuthScheme, Serializable {
         this.paramMap.clear();
         final List<NameValuePair> params = authChallenge.getParams();
         if (params != null) {
-            for (final NameValuePair param: params) {
-                this.paramMap.put(param.getName().toLowerCase(Locale.ROOT), param.getValue());
-            }
+            params.forEach(param -> this.paramMap.put(param.getName().toLowerCase(Locale.ROOT), param.getValue()));
         }
         if (this.paramMap.isEmpty()) {
             throw new MalformedChallengeException("Missing digest auth parameters");
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/HttpAuthenticator.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/HttpAuthenticator.java
index a5507fdd6..06a9097c8 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/HttpAuthenticator.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/auth/HttpAuthenticator.java
@@ -190,12 +190,8 @@ public final class HttpAuthenticator {
                 }
                 continue;
             }
-            for (final AuthChallenge authChallenge: authChallenges) {
-                final String schemeName = authChallenge.getSchemeName().toLowerCase(Locale.ROOT);
-                if (!challengeMap.containsKey(schemeName)) {
-                    challengeMap.put(schemeName, authChallenge);
-                }
-            }
+            authChallenges.forEach(authChallenge -> challengeMap
+                    .putIfAbsent(authChallenge.getSchemeName().toLowerCase(Locale.ROOT), authChallenge));
         }
         if (challengeMap.isEmpty()) {
             if (LOG.isDebugEnabled()) {
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/ClassicRequestCopier.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/ClassicRequestCopier.java
index dfdfff06d..5a14d57ed 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/ClassicRequestCopier.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/ClassicRequestCopier.java
@@ -26,10 +26,7 @@
  */
 package org.apache.hc.client5.http.impl.classic;
 
-import java.util.Iterator;
-
 import org.apache.hc.core5.http.ClassicHttpRequest;
-import org.apache.hc.core5.http.Header;
 import org.apache.hc.core5.http.message.BasicClassicHttpRequest;
 
 /**
@@ -53,9 +50,7 @@ public final class ClassicRequestCopier implements org.apache.hc.client5.http.im
         copy.setScheme(original.getScheme());
         copy.setAuthority(original.getAuthority());
         copy.setVersion(original.getVersion());
-        for (final Iterator<Header> it = original.headerIterator(); it.hasNext(); ) {
-            copy.addHeader(it.next());
-        }
+        original.headerIterator().forEachRemaining(copy::addHeader);
         copy.setEntity(original.getEntity());
         return copy;
     }
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/HttpClientBuilder.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/HttpClientBuilder.java
index b8d0d1037..aa4e94342 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/HttpClientBuilder.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/HttpClientBuilder.java
@@ -34,7 +34,6 @@ import java.util.Collection;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
-import java.util.Map;
 
 import org.apache.hc.client5.http.AuthenticationStrategy;
 import org.apache.hc.client5.http.ConnectionKeepAliveStrategy;
@@ -878,9 +877,7 @@ public class HttpClientBuilder {
             if (contentDecoderMap != null) {
                 final List<String> encodings = new ArrayList<>(contentDecoderMap.keySet());
                 final RegistryBuilder<InputStreamFactory> b2 = RegistryBuilder.create();
-                for (final Map.Entry<String, InputStreamFactory> entry: contentDecoderMap.entrySet()) {
-                    b2.register(entry.getKey(), entry.getValue());
-                }
+                contentDecoderMap.entrySet().forEach(entry -> b2.register(entry.getKey(), entry.getValue()));
                 final Registry<InputStreamFactory> decoderRegistry = b2.build();
                 execChainDefinition.addFirst(
                         new ContentCompressionExec(encodings, decoderRegistry, true),
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/ProtocolExec.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/ProtocolExec.java
index 8ef37e4d0..f4d049f5f 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/ProtocolExec.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/classic/ProtocolExec.java
@@ -28,7 +28,6 @@
 package org.apache.hc.client5.http.impl.classic;
 
 import java.io.IOException;
-import java.util.Iterator;
 
 import org.apache.hc.client5.http.AuthenticationStrategy;
 import org.apache.hc.client5.http.HttpRoute;
@@ -49,7 +48,6 @@ import org.apache.hc.core5.annotation.Internal;
 import org.apache.hc.core5.annotation.ThreadingBehavior;
 import org.apache.hc.core5.http.ClassicHttpRequest;
 import org.apache.hc.core5.http.ClassicHttpResponse;
-import org.apache.hc.core5.http.Header;
 import org.apache.hc.core5.http.HttpEntity;
 import org.apache.hc.core5.http.HttpException;
 import org.apache.hc.core5.http.HttpHeaders;
@@ -236,9 +234,7 @@ public final class ProtocolExec implements ExecChainHandler {
                     // Reset request headers
                     final ClassicHttpRequest original = scope.originalRequest;
                     request.setHeaders();
-                    for (final Iterator<Header> it = original.headerIterator(); it.hasNext(); ) {
-                        request.addHeader(it.next());
-                    }
+                    original.headerIterator().forEachRemaining(request::addHeader);
                 } else {
                     ResponseEntityProxy.enhance(response, execRuntime);
                     return response;
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/CookieSpecBase.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/CookieSpecBase.java
index af9782214..001f86409 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/CookieSpecBase.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/cookie/CookieSpecBase.java
@@ -132,12 +132,7 @@ public abstract class CookieSpecBase extends AbstractCookieSpec {
     public boolean match(final Cookie cookie, final CookieOrigin origin) {
         Args.notNull(cookie, "Cookie");
         Args.notNull(origin, "Cookie origin");
-        for (final CookieAttributeHandler handler: getAttribHandlers()) {
-            if (!handler.match(cookie, origin)) {
-                return false;
-            }
-        }
-        return true;
+        return getAttribHandlers().stream().allMatch(handler -> handler.match(cookie, origin));
     }
 
 }
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/DefaultManagedHttpClientConnection.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/DefaultManagedHttpClientConnection.java
index a5f80a169..fcaae05e7 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/DefaultManagedHttpClientConnection.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/io/DefaultManagedHttpClientConnection.java
@@ -33,6 +33,7 @@ import java.net.Socket;
 import java.nio.charset.CharsetDecoder;
 import java.nio.charset.CharsetEncoder;
 import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.stream.Stream;
 
 import javax.net.ssl.SSLSession;
 import javax.net.ssl.SSLSocket;
@@ -41,7 +42,6 @@ import org.apache.hc.client5.http.io.ManagedHttpClientConnection;
 import org.apache.hc.core5.http.ClassicHttpRequest;
 import org.apache.hc.core5.http.ClassicHttpResponse;
 import org.apache.hc.core5.http.ContentLengthStrategy;
-import org.apache.hc.core5.http.Header;
 import org.apache.hc.core5.http.config.Http1Config;
 import org.apache.hc.core5.http.impl.io.DefaultBHttpClientConnection;
 import org.apache.hc.core5.http.impl.io.SocketHolder;
@@ -187,10 +187,7 @@ final class DefaultManagedHttpClientConnection
     protected void onResponseReceived(final ClassicHttpResponse response) {
         if (response != null && HEADER_LOG.isDebugEnabled()) {
             HEADER_LOG.debug("{} << {}", this.id, new StatusLine(response));
-            final Header[] headers = response.getHeaders();
-            for (final Header header : headers) {
-                HEADER_LOG.debug("{} << {}", this.id, header);
-            }
+            Stream.of(response.getHeaders()).forEach(header -> HEADER_LOG.debug("{} << {}", this.id, header));
         }
     }
 
@@ -198,10 +195,7 @@ final class DefaultManagedHttpClientConnection
     protected void onRequestSubmitted(final ClassicHttpRequest request) {
         if (request != null && HEADER_LOG.isDebugEnabled()) {
             HEADER_LOG.debug("{} >> {}", this.id, new RequestLine(request));
-            final Header[] headers = request.getHeaders();
-            for (final Header header : headers) {
-                HEADER_LOG.debug("{} >> {}", this.id, header);
-            }
+            Stream.of(request.getHeaders()).forEach(header -> HEADER_LOG.debug("{} >> {}", this.id, header));
         }
     }
 
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/routing/BasicRouteDirector.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/routing/BasicRouteDirector.java
index 15b197d72..66d51a4d3 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/routing/BasicRouteDirector.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/routing/BasicRouteDirector.java
@@ -155,7 +155,7 @@ public class BasicRouteDirector implements HttpRouteDirector {
             return UNREACHABLE;
         }
 
-        for (int i=0; i<fhc-1; i++) {
+        for (int i = 0; i < fhc - 1; i++) {
             if (!plan.getHopTarget(i).equals(fact.getHopTarget(i))) {
                 return UNREACHABLE;
             }
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/routing/SystemDefaultRoutePlanner.java b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/routing/SystemDefaultRoutePlanner.java
index b62cb7720..9a9d4f17f 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/impl/routing/SystemDefaultRoutePlanner.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/impl/routing/SystemDefaultRoutePlanner.java
@@ -106,7 +106,7 @@ public class SystemDefaultRoutePlanner extends DefaultRoutePlanner {
     private Proxy chooseProxy(final List<Proxy> proxies) {
         Proxy result = null;
         // check the list for one we can use
-        for (int i=0; (result == null) && (i < proxies.size()); i++) {
+        for (int i = 0; (result == null) && (i < proxies.size()); i++) {
             final Proxy p = proxies.get(i);
             switch (p.type()) {
 
@@ -122,7 +122,7 @@ public class SystemDefaultRoutePlanner extends DefaultRoutePlanner {
             }
         }
         if (result == null) {
-            //@@@ log as warning or info that only a socks proxy is available?
+            // @@@ log as warning or info that only a socks proxy is available?
             // result can only be null if all proxies are socks proxies
             // socks proxies are not handled on the route planning level
             result = Proxy.NO_PROXY;
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/protocol/RequestAddCookies.java b/httpclient5/src/main/java/org/apache/hc/client5/http/protocol/RequestAddCookies.java
index 39d67977c..7a6b02dcf 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/protocol/RequestAddCookies.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/protocol/RequestAddCookies.java
@@ -33,17 +33,16 @@ import java.util.ArrayList;
 import java.util.List;
 
 import org.apache.hc.client5.http.RouteInfo;
-import org.apache.hc.client5.http.cookie.StandardCookieSpec;
 import org.apache.hc.client5.http.config.RequestConfig;
 import org.apache.hc.client5.http.cookie.Cookie;
 import org.apache.hc.client5.http.cookie.CookieOrigin;
 import org.apache.hc.client5.http.cookie.CookieSpec;
 import org.apache.hc.client5.http.cookie.CookieSpecFactory;
 import org.apache.hc.client5.http.cookie.CookieStore;
+import org.apache.hc.client5.http.cookie.StandardCookieSpec;
 import org.apache.hc.core5.annotation.Contract;
 import org.apache.hc.core5.annotation.ThreadingBehavior;
 import org.apache.hc.core5.http.EntityDetails;
-import org.apache.hc.core5.http.Header;
 import org.apache.hc.core5.http.HttpException;
 import org.apache.hc.core5.http.HttpRequest;
 import org.apache.hc.core5.http.HttpRequestInterceptor;
@@ -154,12 +153,11 @@ public class RequestAddCookies implements HttpRequestInterceptor {
         }
         final CookieSpec cookieSpec = factory.create(clientContext);
         // Get all cookies available in the HTTP state
-        final List<Cookie> cookies = cookieStore.getCookies();
         // Find cookies matching the given origin
         final List<Cookie> matchedCookies = new ArrayList<>();
         final Instant now = Instant.now();
         boolean expired = false;
-        for (final Cookie cookie : cookies) {
+        for (final Cookie cookie : cookieStore) {
             if (!cookie.isExpired(now)) {
                 if (cookieSpec.match(cookie, cookieOrigin)) {
                     if (LOG.isDebugEnabled()) {
@@ -182,10 +180,7 @@ public class RequestAddCookies implements HttpRequestInterceptor {
         }
         // Generate Cookie request headers
         if (!matchedCookies.isEmpty()) {
-            final List<Header> headers = cookieSpec.formatCookies(matchedCookies);
-            for (final Header header : headers) {
-                request.addHeader(header);
-            }
+            cookieSpec.formatCookies(matchedCookies).forEach(request::addHeader);
         }
 
         // Stick the CookieSpec and CookieOrigin instances to the HTTP context
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/protocol/RequestDefaultHeaders.java b/httpclient5/src/main/java/org/apache/hc/client5/http/protocol/RequestDefaultHeaders.java
index 6293580a9..da05ced6e 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/protocol/RequestDefaultHeaders.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/protocol/RequestDefaultHeaders.java
@@ -81,11 +81,11 @@ public class RequestDefaultHeaders implements HttpRequestInterceptor {
         }
 
         if (this.defaultHeaders != null) {
-            for (final Header defHeader : this.defaultHeaders) {
-                if(!request.containsHeader(defHeader.getName())) {
+            this.defaultHeaders.forEach(defHeader -> {
+                if (!request.containsHeader(defHeader.getName())) {
                     request.addHeader(defHeader);
                 }
-            }
+            });
         }
     }
 
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/psl/PublicSuffixMatcher.java b/httpclient5/src/main/java/org/apache/hc/client5/http/psl/PublicSuffixMatcher.java
index 191d4d5b5..854f946f2 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/psl/PublicSuffixMatcher.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/psl/PublicSuffixMatcher.java
@@ -30,7 +30,11 @@ import java.net.IDN;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+import java.util.function.Function;
+import java.util.stream.Collectors;
 
 import org.apache.hc.client5.http.utils.DnsUtils;
 import org.apache.hc.core5.annotation.Contract;
@@ -51,8 +55,8 @@ import org.apache.hc.core5.util.Args;
 @Contract(threading = ThreadingBehavior.SAFE)
 public final class PublicSuffixMatcher {
 
-    private final Map<String, DomainType> rules;
-    private final Map<String, DomainType> exceptions;
+    private final ConcurrentMap<String, DomainType> rules;
+    private final ConcurrentMap<String, DomainType> exceptions;
 
     public PublicSuffixMatcher(final Collection<String> rules, final Collection<String> exceptions) {
         this(DomainType.UNKNOWN, rules, exceptions);
@@ -63,40 +67,30 @@ public final class PublicSuffixMatcher {
      */
     public PublicSuffixMatcher(
             final DomainType domainType, final Collection<String> rules, final Collection<String> exceptions) {
-        Args.notNull(domainType,  "Domain type");
-        Args.notNull(rules,  "Domain suffix rules");
-        this.rules = new ConcurrentHashMap<>(rules.size());
-        for (final String rule: rules) {
-            this.rules.put(rule, domainType);
-        }
-        this.exceptions = new ConcurrentHashMap<>();
-        if (exceptions != null) {
-            for (final String exception: exceptions) {
-                this.exceptions.put(exception, domainType);
-            }
-        }
+        Args.notNull(domainType, "Domain type");
+        Args.notNull(rules, "Domain suffix rules");
+        this.rules = rules.stream().filter(Objects::nonNull)
+                .collect(Collectors.toConcurrentMap(Function.identity(), k -> domainType));
+        this.exceptions = exceptions == null ? new ConcurrentHashMap<>()
+                : exceptions.stream().filter(Objects::nonNull)
+                        .collect(Collectors.toConcurrentMap(Function.identity(), k -> domainType));
     }
 
     /**
      * @since 4.5
      */
     public PublicSuffixMatcher(final Collection<PublicSuffixList> lists) {
-        Args.notNull(lists,  "Domain suffix lists");
+        Args.notNull(lists, "Domain suffix lists");
         this.rules = new ConcurrentHashMap<>();
         this.exceptions = new ConcurrentHashMap<>();
-        for (final PublicSuffixList list: lists) {
+        lists.forEach(list -> {
             final DomainType domainType = list.getType();
-            final List<String> rules = list.getRules();
-            for (final String rule: rules) {
-                this.rules.put(rule, domainType);
-            }
+            list.getRules().forEach(rule -> this.rules.put(rule, domainType));
             final List<String> exceptions = list.getExceptions();
             if (exceptions != null) {
-                for (final String exception: exceptions) {
-                    this.exceptions.put(exception, domainType);
-                }
+                exceptions.forEach(exception -> this.exceptions.put(exception, domainType));
             }
-        }
+        });
     }
 
     private static DomainType findEntry(final Map<String, DomainType> map, final String rule) {
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/SSLConnectionSocketFactory.java b/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/SSLConnectionSocketFactory.java
index 03a7aa6a5..12fce5c8d 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/SSLConnectionSocketFactory.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/SSLConnectionSocketFactory.java
@@ -115,12 +115,7 @@ public class SSLConnectionSocketFactory implements LayeredConnectionSocketFactor
     }
 
     static boolean isWeakCipherSuite(final String cipherSuite) {
-        for (final Pattern pattern : WEAK_CIPHER_SUITE_PATTERNS) {
-            if (pattern.matcher(cipherSuite).matches()) {
-                return true;
-            }
-        }
-        return false;
+        return WEAK_CIPHER_SUITE_PATTERNS.stream().anyMatch(pattern -> pattern.matcher(cipherSuite).matches());
     }
 
     private final javax.net.ssl.SSLSocketFactory socketFactory;
diff --git a/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/TlsSessionValidator.java b/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/TlsSessionValidator.java
index 76541ff46..f5072f48c 100644
--- a/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/TlsSessionValidator.java
+++ b/httpclient5/src/main/java/org/apache/hc/client5/http/ssl/TlsSessionValidator.java
@@ -74,7 +74,7 @@ final class TlsSessionValidator {
                         final List<String> altNames = new ArrayList<>();
                         for (final List<?> aC : altNames1) {
                             if (!aC.isEmpty()) {
-                                altNames.add(Objects.toString(aC.get(1), null));
+                                altNames.add(Objects.toString(aC.get(1)));
                             }
                         }
                         log.debug(" peer alternative names: {}", altNames);
@@ -87,7 +87,7 @@ final class TlsSessionValidator {
                         final List<String> altNames = new ArrayList<>();
                         for (final List<?> aC : altNames2) {
                             if (!aC.isEmpty()) {
-                                altNames.add(Objects.toString(aC.get(1), null));
+                                altNames.add(Objects.toString(aC.get(1)));
                             }
                         }
                         log.debug(" issuer alternative names: {}", altNames);
diff --git a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientCustomContext.java b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientCustomContext.java
index ce93914f8..b52fc4e1f 100644
--- a/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientCustomContext.java
+++ b/httpclient5/src/test/java/org/apache/hc/client5/http/examples/ClientCustomContext.java
@@ -27,12 +27,9 @@
 
 package org.apache.hc.client5.http.examples;
 
-import java.util.List;
-
 import org.apache.hc.client5.http.ContextBuilder;
 import org.apache.hc.client5.http.classic.methods.HttpGet;
 import org.apache.hc.client5.http.cookie.BasicCookieStore;
-import org.apache.hc.client5.http.cookie.Cookie;
 import org.apache.hc.client5.http.cookie.CookieStore;
 import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
 import org.apache.hc.client5.http.impl.classic.HttpClients;
@@ -64,8 +61,7 @@ public class ClientCustomContext {
             httpclient.execute(httpget, localContext, response -> {
                 System.out.println("----------------------------------------");
                 System.out.println(httpget + "->" + new StatusLine(response));
-                final List<Cookie> cookies = cookieStore.getCookies();
-                cookies.forEach(element -> System.out.println("Local cookie: " + element));
+                cookieStore.forEach(element -> System.out.println("Local cookie: " + element));
                 EntityUtils.consume(response.getEntity());
                 return null;
             });