diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/layout/Log4j1XmlLayout.java b/log4j-1.2-api/src/main/java/org/apache/log4j/layout/Log4j1XmlLayout.java
index 899ebb6..12bb405 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/layout/Log4j1XmlLayout.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/layout/Log4j1XmlLayout.java
@@ -137,16 +137,13 @@
             final ReadOnlyStringMap contextMap = event.getContextData();
             if (!contextMap.isEmpty()) {
                 buf.append("<log4j:properties>\r\n");
-                contextMap.forEach(new BiConsumer<String, String>() {
-                    @Override
-                    public void accept(final String key, final String val) {
-                        if (val != null) {
-                            buf.append("<log4j:data name=\"");
-                            buf.append(Transform.escapeHtmlTags(key));
-                            buf.append("\" value=\"");
-                            buf.append(Transform.escapeHtmlTags(val));
-                            buf.append("\"/>\r\n");
-                        }
+                contextMap.forEach((BiConsumer<String, String>) (key, val) -> {
+                    if (val != null) {
+                        buf.append("<log4j:data name=\"");
+                        buf.append(Transform.escapeHtmlTags(key));
+                        buf.append("\" value=\"");
+                        buf.append(Transform.escapeHtmlTags(val));
+                        buf.append("\"/>\r\n");
                     }
                 });
                 buf.append("</log4j:properties>\r\n");
diff --git a/log4j-1.2-api/src/main/java/org/apache/log4j/pattern/Log4j1MdcPatternConverter.java b/log4j-1.2-api/src/main/java/org/apache/log4j/pattern/Log4j1MdcPatternConverter.java
index 09e06a6..0d82aa6 100644
--- a/log4j-1.2-api/src/main/java/org/apache/log4j/pattern/Log4j1MdcPatternConverter.java
+++ b/log4j-1.2-api/src/main/java/org/apache/log4j/pattern/Log4j1MdcPatternConverter.java
@@ -79,10 +79,5 @@
         }
     }
 
-    private static final TriConsumer<String, Object, StringBuilder> APPEND_EACH = new TriConsumer<String, Object, StringBuilder>() {
-        @Override
-        public void accept(final String key, final Object value, final StringBuilder toAppendTo) {
-            toAppendTo.append('{').append(key).append(',').append(value).append('}');
-        }
-    };
+    private static final TriConsumer<String, Object, StringBuilder> APPEND_EACH = (key, value, toAppendTo) -> toAppendTo.append('{').append(key).append(',').append(value).append('}');
 }
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java
index f98bd39..6794430 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/LoaderUtil.java
@@ -338,12 +338,7 @@
             try {
                 forceTcclOnly = System.getSecurityManager() == null ?
                     Boolean.getBoolean(FORCE_TCL_ONLY_PROPERTY) :
-                    AccessController.doPrivileged(new PrivilegedAction<Boolean>() {
-                        @Override
-                        public Boolean run() {
-                            return Boolean.getBoolean(FORCE_TCL_ONLY_PROPERTY);
-                        }
-                    });
+                    AccessController.doPrivileged((PrivilegedAction<Boolean>) () -> Boolean.getBoolean(FORCE_TCL_ONLY_PROPERTY));
             } catch (final SecurityException se) {
                 forceTcclOnly = false;
             }
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertiesUtil.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertiesUtil.java
index ac2216b..1efd771 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertiesUtil.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/PropertiesUtil.java
@@ -427,12 +427,9 @@
         private Environment(final PropertySource propertySource) {
             final PropertyFilePropertySource sysProps = new PropertyFilePropertySource(LOG4J_SYSTEM_PROPERTIES_FILE_NAME);
             try {
-                sysProps.forEach(new BiConsumer<String, String>() {
-                    @Override
-                    public void accept(final String key, final String value) {
-                        if (System.getProperty(key) == null) {
-                            System.setProperty(key, value);
-                        }
+                sysProps.forEach((key, value) -> {
+                    if (System.getProperty(key) == null) {
+                        System.setProperty(key, value);
                     }
                 });
             } catch (final SecurityException ex) {
@@ -459,18 +456,15 @@
             normalized.clear();
             tokenized.clear();
             for (final PropertySource source : sources) {
-                source.forEach(new BiConsumer<String, String>() {
-                    @Override
-                    public void accept(final String key, final String value) {
-                        if (key != null && value != null) {
-                            literal.put(key, value);
-                            final List<CharSequence> tokens = PropertySource.Util.tokenize(key);
-                            if (tokens.isEmpty()) {
-                                normalized.put(source.getNormalForm(Collections.singleton(key)), value);
-                            } else {
-                                normalized.put(source.getNormalForm(tokens), value);
-                                tokenized.put(tokens, value);
-                            }
+                source.forEach((key, value) -> {
+                    if (key != null && value != null) {
+                        literal.put(key, value);
+                        final List<CharSequence> tokens = PropertySource.Util.tokenize(key);
+                        if (tokens.isEmpty()) {
+                            normalized.put(source.getNormalForm(Collections.singleton(key)), value);
+                        } else {
+                            normalized.put(source.getNormalForm(tokens), value);
+                            tokenized.put(tokens, value);
                         }
                     }
                 });
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/SortedArrayStringMap.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/SortedArrayStringMap.java
index 0882f6f..c7df7a7 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/SortedArrayStringMap.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/SortedArrayStringMap.java
@@ -67,12 +67,7 @@
     private static final long serialVersionUID = -5748905872274478116L;
     private static final int HASHVAL = 31;
 
-    private static final TriConsumer<String, Object, StringMap> PUT_ALL = new TriConsumer<String, Object, StringMap>() {
-        @Override
-        public void accept(final String key, final Object value, final StringMap contextData) {
-            contextData.putValue(key, value);
-        }
-    };
+    private static final TriConsumer<String, Object, StringMap> PUT_ALL = (key, value, contextData) -> contextData.putValue(key, value);
 
     /**
      * An empty array instance to share when the table is not inflated.
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/util/StackLocator.java b/log4j-api/src/main/java/org/apache/logging/log4j/util/StackLocator.java
index ac6819b..86477de 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/util/StackLocator.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/util/StackLocator.java
@@ -79,7 +79,7 @@
             return PrivateSecurityManagerStackTraceUtil.getCurrentStackTrace();
         }
         final Stack<Class<?>> stack = new Stack<Class<?>>();
-        final List<Class<?>> classes = walker.walk(s -> s.map(f -> f.getDeclaringClass()).collect(Collectors.toList()));
+        final List<Class<?>> classes = walker.walk(s -> s.map(StackWalker.StackFrame::getDeclaringClass).collect(Collectors.toList()));
         stack.addAll(classes);
         return stack;
     }
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManager.java
index 40c3c02..c972526 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/MemoryMappedFileManager.java
@@ -214,17 +214,14 @@
     private static void unsafeUnmap(final MappedByteBuffer mbb) throws PrivilegedActionException {
         LOGGER.debug("MMapAppender unmapping old buffer...");
         final long startNanos = System.nanoTime();
-        AccessController.doPrivileged(new PrivilegedExceptionAction<Object>() {
-            @Override
-            public Object run() throws Exception {
-                final Class<?> unsafeClass = Class.forName("sun.misc.Unsafe");
-                final Field unsafeField = unsafeClass.getDeclaredField("theUnsafe");
-                unsafeField.setAccessible(true);
-                final Object unsafe = unsafeField.get(null);
-                final Method invokeCleaner = unsafeClass.getMethod("invokeCleaner", ByteBuffer.class);
-                invokeCleaner.invoke(unsafe, mbb);
-                return null;
-            }
+        AccessController.doPrivileged((PrivilegedExceptionAction<Object>) () -> {
+            final Class<?> unsafeClass = Class.forName("sun.misc.Unsafe");
+            final Field unsafeField = unsafeClass.getDeclaredField("theUnsafe");
+            unsafeField.setAccessible(true);
+            final Object unsafe = unsafeField.get(null);
+            final Method invokeCleaner = unsafeClass.getMethod("invokeCleaner", ByteBuffer.class);
+            invokeCleaner.invoke(unsafe, mbb);
+            return null;
         });
         final float millis = (float) ((System.nanoTime() - startNanos) / NANOS_PER_MILLISEC);
         LOGGER.debug("MMapAppender unmapped buffer OK in {} millis", millis);
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/nosql/NoSqlDatabaseManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/nosql/NoSqlDatabaseManager.java
index 14322e3..3f1782c 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/nosql/NoSqlDatabaseManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/appender/nosql/NoSqlDatabaseManager.java
@@ -86,12 +86,7 @@
 
     private void setFields(final MapMessage<?, ?> mapMessage, final NoSqlObject<W> noSqlObject) {
         // Map without calling org.apache.logging.log4j.message.MapMessage#getData() which makes a copy of the map.
-        mapMessage.forEach(new BiConsumer<String, Object>() {
-            @Override
-            public void accept(final String key, final Object value) {
-                noSqlObject.set(key, value);
-            }
-        });
+        mapMessage.forEach((key, value) -> noSqlObject.set(key, value));
     }
 
     private void setFields(final LogEvent event, final NoSqlObject<W> entity) {
@@ -147,12 +142,7 @@
             entity.set("contextMap", (Object) null);
         } else {
             final NoSqlObject<W> contextMapEntity = this.connection.createObject();
-            contextMap.forEach(new BiConsumer<String, String>() {
-                @Override
-                public void accept(final String key, final String val) {
-                    contextMapEntity.set(key, val);
-                }
-            });
+            contextMap.forEach((BiConsumer<String, String>) (key, val) -> contextMapEntity.set(key, val));
             entity.set("contextMap", contextMapEntity);
         }
 
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigDisruptor.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigDisruptor.java
index 252cd28..1447fdb 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigDisruptor.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/AsyncLoggerConfigDisruptor.java
@@ -131,51 +131,31 @@
      * Factory used to populate the RingBuffer with events. These event objects are then re-used during the life of the
      * RingBuffer.
      */
-    private static final EventFactory<Log4jEventWrapper> FACTORY = new EventFactory<Log4jEventWrapper>() {
-        @Override
-        public Log4jEventWrapper newInstance() {
-            return new Log4jEventWrapper();
-        }
-    };
+    private static final EventFactory<Log4jEventWrapper> FACTORY = Log4jEventWrapper::new;
 
     /**
      * Factory used to populate the RingBuffer with events. These event objects are then re-used during the life of the
      * RingBuffer.
      */
-    private static final EventFactory<Log4jEventWrapper> MUTABLE_FACTORY = new EventFactory<Log4jEventWrapper>() {
-        @Override
-        public Log4jEventWrapper newInstance() {
-            return new Log4jEventWrapper(new MutableLogEvent());
-        }
-    };
+    private static final EventFactory<Log4jEventWrapper> MUTABLE_FACTORY = () -> new Log4jEventWrapper(new MutableLogEvent());
 
     /**
      * Object responsible for passing on data to a specific RingBuffer event.
      */
     private static final EventTranslatorTwoArg<Log4jEventWrapper, LogEvent, AsyncLoggerConfig> TRANSLATOR =
-            new EventTranslatorTwoArg<Log4jEventWrapper, LogEvent, AsyncLoggerConfig>() {
-
-        @Override
-        public void translateTo(final Log4jEventWrapper ringBufferElement, final long sequence,
-                final LogEvent logEvent, final AsyncLoggerConfig loggerConfig) {
-            ringBufferElement.event = logEvent;
-            ringBufferElement.loggerConfig = loggerConfig;
-        }
-    };
+            (ringBufferElement, sequence, logEvent, loggerConfig) -> {
+                ringBufferElement.event = logEvent;
+                ringBufferElement.loggerConfig = loggerConfig;
+            };
 
     /**
      * Object responsible for passing on data to a RingBuffer event with a MutableLogEvent.
      */
     private static final EventTranslatorTwoArg<Log4jEventWrapper, LogEvent, AsyncLoggerConfig> MUTABLE_TRANSLATOR =
-            new EventTranslatorTwoArg<Log4jEventWrapper, LogEvent, AsyncLoggerConfig>() {
-
-        @Override
-        public void translateTo(final Log4jEventWrapper ringBufferElement, final long sequence,
-                final LogEvent logEvent, final AsyncLoggerConfig loggerConfig) {
-            ((MutableLogEvent) ringBufferElement.event).initFrom(logEvent);
-            ringBufferElement.loggerConfig = loggerConfig;
-        }
-    };
+            (ringBufferElement, sequence, logEvent, loggerConfig) -> {
+                ((MutableLogEvent) ringBufferElement.event).initFrom(logEvent);
+                ringBufferElement.loggerConfig = loggerConfig;
+            };
 
     private int ringBufferSize;
     private AsyncQueueFullPolicy asyncQueueFullPolicy;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java
index b77a4f6..a221afd 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/DisruptorUtil.java
@@ -160,12 +160,7 @@
      * @return the thread ID of the background appender thread
      */
     public static long getExecutorThreadId(final ExecutorService executor) {
-        final Future<Long> result = executor.submit(new Callable<Long>() {
-            @Override
-            public Long call() {
-                return Thread.currentThread().getId();
-            }
-        });
+        final Future<Long> result = executor.submit(() -> Thread.currentThread().getId());
         try {
             return result.get();
         } catch (final Exception ex) {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/JCToolsBlockingQueueFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/JCToolsBlockingQueueFactory.java
index 9333611..1c1783f 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/async/JCToolsBlockingQueueFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/async/JCToolsBlockingQueueFactory.java
@@ -71,12 +71,7 @@
 
         @Override
         public int drainTo(final Collection<? super E> c, final int maxElements) {
-            return drain(new Consumer<E>() {
-                @Override
-                public void accept(final E e) {
-                    c.add(e);
-                }
-            }, maxElements);
+            return drain(c::add, maxElements);
         }
 
         @Override
@@ -148,36 +143,22 @@
     }
 
     public enum WaitStrategy {
-        SPIN(new Idle() {
-            @Override
-            public int idle(final int idleCounter) {
-                return idleCounter + 1;
-            }
+        SPIN(idleCounter -> idleCounter + 1),
+        YIELD(idleCounter -> {
+            Thread.yield();
+            return idleCounter + 1;
         }),
-        YIELD(new Idle() {
-            @Override
-            public int idle(final int idleCounter) {
-                Thread.yield();
-                return idleCounter + 1;
-            }
+        PARK(idleCounter -> {
+            LockSupport.parkNanos(1L);
+            return idleCounter + 1;
         }),
-        PARK(new Idle() {
-            @Override
-            public int idle(final int idleCounter) {
+        PROGRESSIVE(idleCounter -> {
+            if (idleCounter > 200) {
                 LockSupport.parkNanos(1L);
-                return idleCounter + 1;
+            } else if (idleCounter > 100) {
+                Thread.yield();
             }
-        }),
-        PROGRESSIVE(new Idle() {
-            @Override
-            public int idle(final int idleCounter) {
-                if (idleCounter > 200) {
-                    LockSupport.parkNanos(1L);
-                } else if (idleCounter > 100) {
-                    Thread.yield();
-                }
-                return idleCounter + 1;
-            }
+            return idleCounter + 1;
         });
 
         private final Idle idle;
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/RegexFilter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/RegexFilter.java
index f5c87ac..35ee5c7 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/RegexFilter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/filter/RegexFilter.java
@@ -142,13 +142,7 @@
             return DEFAULT_PATTERN_FLAGS;
         }
         final Field[] fields = Pattern.class.getDeclaredFields();
-        final Comparator<Field> comparator = new Comparator<Field>() {
-
-            @Override
-            public int compare(final Field f1, final Field f2) {
-                return f1.getName().compareTo(f2.getName());
-            }
-        };
+        final Comparator<Field> comparator = (f1, f2) -> f1.getName().compareTo(f2.getName());
         Arrays.sort(fields, comparator);
         final String[] fieldNames = new String[fields.length];
         for (int i = 0; i < fields.length; i++) {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/JdkMapAdapterStringMap.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/JdkMapAdapterStringMap.java
index f1cd4bc..4d0ea36 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/JdkMapAdapterStringMap.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/impl/JdkMapAdapterStringMap.java
@@ -33,17 +33,14 @@
 public class JdkMapAdapterStringMap implements StringMap {
     private static final long serialVersionUID = -7348247784983193612L;
     private static final String FROZEN = "Frozen collection cannot be modified";
-    private static final Comparator<? super String> NULL_FIRST_COMPARATOR = new Comparator<String>() {
-        @Override
-        public int compare(final String left, final String right) {
-            if (left == null) {
-                return -1;
-            }
-            if (right == null) {
-                return 1;
-            }
-            return left.compareTo(right);
+    private static final Comparator<? super String> NULL_FIRST_COMPARATOR = (Comparator<String>) (left, right) -> {
+        if (left == null) {
+            return -1;
         }
+        if (right == null) {
+            return 1;
+        }
+        return left.compareTo(right);
     };
 
     private final Map<String, String> map;
@@ -143,12 +140,7 @@
         sortedKeys = null;
     }
 
-    private static final TriConsumer<String, String, Map<String, String>> PUT_ALL = new TriConsumer<String, String, Map<String, String>>() {
-        @Override
-        public void accept(final String key, final String value, final Map<String, String> stringStringMap) {
-            stringStringMap.put(key, value);
-        }
-    };
+    private static final TriConsumer<String, String, Map<String, String>> PUT_ALL = (key, value, stringStringMap) -> stringStringMap.put(key, value);
 
     @Override
     public void putValue(final String key, final Object value) {
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MdcPatternConverter.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MdcPatternConverter.java
index b7b3c1b..7cb1d8d 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MdcPatternConverter.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/pattern/MdcPatternConverter.java
@@ -78,13 +78,10 @@
         return new MdcPatternConverter(options);
     }
 
-    private static final TriConsumer<String, Object, StringBuilder> WRITE_KEY_VALUES_INTO = new TriConsumer<String, Object, StringBuilder>() {
-        @Override
-        public void accept(final String key, final Object value, final StringBuilder sb) {
-            sb.append(key).append('=');
-            StringBuilders.appendValue(sb, value);
-            sb.append(", ");
-        }
+    private static final TriConsumer<String, Object, StringBuilder> WRITE_KEY_VALUES_INTO = (key, value, sb) -> {
+        sb.append(key).append('=');
+        StringBuilders.appendValue(sb, value);
+        sb.append(", ");
     };
 
     /**
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptManager.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptManager.java
index a167aa4..f9790af 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptManager.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/script/ScriptManager.java
@@ -171,12 +171,7 @@
             logger.warn("No script named {} could be found");
             return null;
         }
-        return AccessController.doPrivileged(new PrivilegedAction<Object>() {
-            @Override
-            public Object run() {
-                return scriptRunner.execute(bindings);
-            }
-        });
+        return AccessController.doPrivileged((PrivilegedAction<Object>) () -> scriptRunner.execute(bindings));
     }
 
     private interface ScriptRunner {
@@ -201,19 +196,16 @@
             CompiledScript compiled = null;
             if (scriptEngine instanceof Compilable) {
                 logger.debug("Script {} is compilable", script.getName());
-                compiled = AccessController.doPrivileged(new PrivilegedAction<CompiledScript>() {
-                    @Override
-                    public CompiledScript run() {
-                        try {
-                            return ((Compilable) scriptEngine).compile(script.getScriptText());
-                        } catch (final Throwable ex) {
-                            /*
-                             * ScriptException is what really should be caught here. However, beanshell's ScriptEngine
-                             * implements Compilable but then throws Error when the compile method is called!
-                             */
-                            logger.warn("Error compiling script", ex);
-                            return null;
-                        }
+                compiled = AccessController.doPrivileged((PrivilegedAction<CompiledScript>) () -> {
+                    try {
+                        return ((Compilable) scriptEngine).compile(script.getScriptText());
+                    } catch (final Throwable ex) {
+                        /*
+                         * ScriptException is what really should be caught here. However, beanshell's ScriptEngine
+                         * implements Compilable but then throws Error when the compile method is called!
+                         */
+                        logger.warn("Error compiling script", ex);
+                        return null;
                     }
                 });
             }
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/ClockFactory.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/ClockFactory.java
index aff68c2..f076f5a 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/ClockFactory.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/ClockFactory.java
@@ -75,12 +75,12 @@
 
     private static Map<String, Supplier<Clock>> aliases() {
         final Map<String, Supplier<Clock>> result = new HashMap<>();
-        result.put("SystemClock",       new Supplier<Clock>() { @Override public Clock get() { return new SystemClock(); } });
-        result.put("SystemMillisClock", new Supplier<Clock>() { @Override public Clock get() { return new SystemMillisClock(); } });
-        result.put("CachedClock",       new Supplier<Clock>() { @Override public Clock get() { return CachedClock.instance(); } });
-        result.put("CoarseCachedClock", new Supplier<Clock>() { @Override public Clock get() { return CoarseCachedClock.instance(); } });
-        result.put("org.apache.logging.log4j.core.time.internal.CachedClock", new Supplier<Clock>() { @Override public Clock get() { return CachedClock.instance(); } });
-        result.put("org.apache.logging.log4j.core.time.internal.CoarseCachedClock", new Supplier<Clock>() { @Override public Clock get() { return CoarseCachedClock.instance(); } });
+        result.put("SystemClock", SystemClock::new);
+        result.put("SystemMillisClock", SystemMillisClock::new);
+        result.put("CachedClock", CachedClock::instance);
+        result.put("CoarseCachedClock", CoarseCachedClock::instance);
+        result.put("org.apache.logging.log4j.core.time.internal.CachedClock", CachedClock::instance);
+        result.put("org.apache.logging.log4j.core.time.internal.CoarseCachedClock", CoarseCachedClock::instance);
         return result;
     }
 
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/CachedClock.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/CachedClock.java
index dd38791..423b4d8 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/CachedClock.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/CachedClock.java
@@ -37,15 +37,12 @@
     private short count = 0;
 
     private CachedClock() {
-        final Thread updater = new Log4jThread(new Runnable() {
-            @Override
-            public void run() {
-                while (true) {
-                    millis = System.currentTimeMillis();
+        final Thread updater = new Log4jThread(() -> {
+            while (true) {
+                millis = System.currentTimeMillis();
 
-                    // avoid explicit dependency on sun.misc.Util
-                    LockSupport.parkNanos(1000 * 1000);
-                }
+                // avoid explicit dependency on sun.misc.Util
+                LockSupport.parkNanos(1000 * 1000);
             }
         }, "CachedClock Updater Thread");
         updater.setDaemon(true);
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/format/FastDateParser.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/format/FastDateParser.java
index 5450100..70185b0 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/format/FastDateParser.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/time/internal/format/FastDateParser.java
@@ -98,12 +98,7 @@
     // comparator used to sort regex alternatives
     // alternatives should be ordered longer first, and shorter last. ('february' before 'feb')
     // all entries must be lowercase by locale.
-    private static final Comparator<String> LONGER_FIRST_LOWERCASE = new Comparator<String>() {
-        @Override
-        public int compare(final String left, final String right) {
-            return right.compareTo(left);
-        }
-    };
+    private static final Comparator<String> LONGER_FIRST_LOWERCASE = (left, right) -> right.compareTo(left);
 
     /**
      * <p>Constructs a new FastDateParser.</p>
diff --git a/log4j-core/src/main/java/org/apache/logging/log4j/core/tools/picocli/CommandLine.java b/log4j-core/src/main/java/org/apache/logging/log4j/core/tools/picocli/CommandLine.java
index 554c4cc..06aa387 100644
--- a/log4j-core/src/main/java/org/apache/logging/log4j/core/tools/picocli/CommandLine.java
+++ b/log4j-core/src/main/java/org/apache/logging/log4j/core/tools/picocli/CommandLine.java
@@ -2577,6 +2577,7 @@
                         return Enum.valueOf((Class<Enum>) type, value);
                     }
                 };
+                return (ITypeConverter<Object>) value -> Enum.valueOf((Class<Enum>) type, value);
             }
             throw new MissingTypeConverterException(CommandLine.this, "No TypeConverter registered for " + type.getName() + " of field " + field);
         }
diff --git a/log4j-jms/src/main/java/org/apache/logging/log4j/jms/appender/JmsManager.java b/log4j-jms/src/main/java/org/apache/logging/log4j/jms/appender/JmsManager.java
index 1ed2ba5..291fd7d 100644
--- a/log4j-jms/src/main/java/org/apache/logging/log4j/jms/appender/JmsManager.java
+++ b/log4j-jms/src/main/java/org/apache/logging/log4j/jms/appender/JmsManager.java
@@ -405,15 +405,12 @@
     private MapMessage map(final org.apache.logging.log4j.message.MapMessage<?, ?> log4jMapMessage,
             final MapMessage jmsMapMessage) {
         // Map without calling org.apache.logging.log4j.message.MapMessage#getData() which makes a copy of the map.
-        log4jMapMessage.forEach(new BiConsumer<String, Object>() {
-            @Override
-            public void accept(final String key, final Object value) {
-                try {
-                    jmsMapMessage.setObject(key, value);
-                } catch (final JMSException e) {
-                    throw new IllegalArgumentException(String.format("%s mapping key '%s' to value '%s': %s",
-                            e.getClass(), key, value, e.getLocalizedMessage()), e);
-                }
+        log4jMapMessage.forEach((key, value) -> {
+            try {
+                jmsMapMessage.setObject(key, value);
+            } catch (final JMSException e) {
+                throw new IllegalArgumentException(String.format("%s mapping key '%s' to value '%s': %s",
+                        e.getClass(), key, value, e.getLocalizedMessage()), e);
             }
         });
         return jmsMapMessage;
diff --git a/log4j-jmx-gui/src/main/java/org/apache/logging/log4j/jmx/gui/ClientGui.java b/log4j-jmx-gui/src/main/java/org/apache/logging/log4j/jmx/gui/ClientGui.java
index a9260b5..4a9e56f 100644
--- a/log4j-jmx-gui/src/main/java/org/apache/logging/log4j/jmx/gui/ClientGui.java
+++ b/log4j-jmx-gui/src/main/java/org/apache/logging/log4j/jmx/gui/ClientGui.java
@@ -179,11 +179,8 @@
 
     @Override
     public void handleNotification(final Notification notif, final Object paramObject) {
-        SwingUtilities.invokeLater(new Runnable() {
-            @Override
-            public void run() { // LOG4J2-538
-                handleNotificationInAwtEventThread(notif, paramObject);
-            }
+        SwingUtilities.invokeLater(() -> { // LOG4J2-538
+            handleNotificationInAwtEventThread(notif, paramObject);
         });
     }
 
@@ -284,29 +281,26 @@
         final Client client = new Client(connector);
         final String title = "Log4j JMX Client - " + url;
 
-        SwingUtilities.invokeLater(new Runnable() {
-            @Override
-            public void run() {
-                installLookAndFeel();
-                try {
-                    final ClientGui gui = new ClientGui(client);
-                    final JFrame frame = new JFrame(title);
-                    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
-                    frame.getContentPane().add(gui, BorderLayout.CENTER);
-                    frame.pack();
-                    frame.setVisible(true);
-                } catch (final Exception ex) {
-                    // if console is visible, print error so that
-                    // the stack trace remains visible after error dialog is
-                    // closed
-                    ex.printStackTrace();
+        SwingUtilities.invokeLater(() -> {
+            installLookAndFeel();
+            try {
+                final ClientGui gui = new ClientGui(client);
+                final JFrame frame = new JFrame(title);
+                frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
+                frame.getContentPane().add(gui, BorderLayout.CENTER);
+                frame.pack();
+                frame.setVisible(true);
+            } catch (final Exception ex) {
+                // if console is visible, print error so that
+                // the stack trace remains visible after error dialog is
+                // closed
+                ex.printStackTrace();
 
-                    // show error in dialog: there may not be a console window
-                    // visible
-                    final StringWriter sr = new StringWriter();
-                    ex.printStackTrace(new PrintWriter(sr));
-                    JOptionPane.showMessageDialog(null, sr.toString(), "Error", JOptionPane.ERROR_MESSAGE);
-                }
+                // show error in dialog: there may not be a console window
+                // visible
+                final StringWriter sr = new StringWriter();
+                ex.printStackTrace(new PrintWriter(sr));
+                JOptionPane.showMessageDialog(null, sr.toString(), "Error", JOptionPane.ERROR_MESSAGE);
             }
         });
     }
diff --git a/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ContextDataJsonAttributeConverter.java b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ContextDataJsonAttributeConverter.java
index b298172..26170ff 100644
--- a/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ContextDataJsonAttributeConverter.java
+++ b/log4j-jpa/src/main/java/org/apache/logging/log4j/jpa/converter/ContextDataJsonAttributeConverter.java
@@ -55,12 +55,9 @@
         try {
             final JsonNodeFactory factory = OBJECT_MAPPER.getNodeFactory();
             final ObjectNode root = factory.objectNode();
-            contextData.forEach(new BiConsumer<String, Object>() {
-                @Override
-                public void accept(final String key, final Object value) {
-                    // we will cheat here and write the toString of the Object... meh, but ok.
-                    root.put(key, String.valueOf(value));
-                }
+            contextData.forEach((key, value) -> {
+                // we will cheat here and write the toString of the Object... meh, but ok.
+                root.put(key, String.valueOf(value));
             });
             return OBJECT_MAPPER.writeValueAsString(root);
         } catch (final Exception e) {
diff --git a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ContextDataSerializer.java b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ContextDataSerializer.java
index 6023ada..95059ab 100644
--- a/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ContextDataSerializer.java
+++ b/log4j-layout-jackson/src/main/java/org/apache/logging/log4j/jackson/ContextDataSerializer.java
@@ -37,21 +37,17 @@
     private static final long serialVersionUID = 1L;
 
     private static final TriConsumer<String, Object, JsonGenerator> WRITE_STRING_FIELD_INTO =
-            new TriConsumer<String, Object, JsonGenerator>() {
-
-        @Override
-        public void accept(final String key, final Object value, final JsonGenerator jsonGenerator) {
-            try {
-                if (value == null) {
-                    jsonGenerator.writeNullField(key);
-                } else {
-                    jsonGenerator.writeStringField(key, String.valueOf(value));
+            (key, value, jsonGenerator) -> {
+                try {
+                    if (value == null) {
+                        jsonGenerator.writeNullField(key);
+                    } else {
+                        jsonGenerator.writeStringField(key, String.valueOf(value));
+                    }
+                } catch (final Exception ex) {
+                    throw new IllegalStateException("Problem with key " + key, ex);
                 }
-            } catch (final Exception ex) {
-                throw new IllegalStateException("Problem with key " + key, ex);
-            }
-        }
-    };
+            };
 
     protected ContextDataSerializer() {
         super(Map.class, false);
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutBenchmarkReport.java b/log4j-perf/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutBenchmarkReport.java
index 5f8dd2c..d42cfcf 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutBenchmarkReport.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/layout/template/json/JsonTemplateLayoutBenchmarkReport.java
@@ -315,9 +315,7 @@
         filteredJmhSummaries
                 .stream()
                 .sorted(jmhSummaryComparator)
-                .forEach((final JmhSummary jmhSummary) -> {
-                    dumpJmhSummary(printStream, maxOpRate, jmhSummary);
-                });
+                .forEach((final JmhSummary jmhSummary) -> dumpJmhSummary(printStream, maxOpRate, jmhSummary));
 
         // Print footer.
         printStream.println("|===");
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ClocksBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ClocksBenchmark.java
index 2d2ccb3..f96a563 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ClocksBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/ClocksBenchmark.java
@@ -155,16 +155,13 @@
         private volatile short count;
 
         private OldCachedClock() {
-            final Thread updater = new Thread(new Runnable() {
-                @Override
-                public void run() {
-                    while (true) {
-                        final long time = System.currentTimeMillis();
-                        millis = time;
+            final Thread updater = new Thread(() -> {
+                while (true) {
+                    final long time = System.currentTimeMillis();
+                    millis = time;
 
-                        // avoid explicit dependency on sun.misc.Util
-                        LockSupport.parkNanos(1000 * 1000);
-                    }
+                    // avoid explicit dependency on sun.misc.Util
+                    LockSupport.parkNanos(1000 * 1000);
                 }
             }, "Clock Updater Thread");
             updater.setDaemon(true);
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/FileAppenderThrowableBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/FileAppenderThrowableBenchmark.java
index fde3b47..cc109ec 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/FileAppenderThrowableBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/FileAppenderThrowableBenchmark.java
@@ -119,11 +119,8 @@
     interface TestIface30 extends ThrowableHelper {}
 
     private static Throwable getComplexThrowable() {
-        ThrowableHelper helper = new ThrowableHelper() {
-            @Override
-            public void action() {
-                throw new IllegalStateException("Test Throwable");
-            }
+        ThrowableHelper helper = () -> {
+            throw new IllegalStateException("Test Throwable");
         };
         try {
             for (int i = 0; i < 31; i++) {
@@ -131,14 +128,11 @@
                 helper = (ThrowableHelper) Proxy.newProxyInstance(
                         FileAppenderThrowableBenchmark.class.getClassLoader(),
                         new Class<?>[]{Class.forName(FileAppenderThrowableBenchmark.class.getName() + "$TestIface" + (i % 31))},
-                        new InvocationHandler() {
-                            @Override
-                            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
-                                try {
-                                    return method.invoke(delegate, args);
-                                } catch (InvocationTargetException e) {
-                                    throw e.getCause();
-                                }
+                        (proxy, method, args) -> {
+                            try {
+                                return method.invoke(delegate, args);
+                            } catch (InvocationTargetException e) {
+                                throw e.getCause();
                             }
                         });
             }
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/SortedArrayVsHashMapBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/SortedArrayVsHashMapBenchmark.java
index 81baeda..047da75 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/SortedArrayVsHashMapBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/SortedArrayVsHashMapBenchmark.java
@@ -145,12 +145,7 @@
         return new HashMap(populatedMap);
     }
 
-    static TriConsumer<String, Object, int[]> COUNTER = new TriConsumer<String, Object, int[]>() {
-        @Override
-        public void accept(final String s, final Object o, final int[] result) {
-            result[0] += s.hashCode() + o.hashCode();
-        }
-    };
+    static TriConsumer<String, Object, int[]> COUNTER = (s, o, result) -> result[0] += s.hashCode() + o.hashCode();
 
     @Benchmark
     public int iterateArrayContextDataTriConsumer() {
@@ -172,12 +167,7 @@
     public int iterateArrayContextDataBiConsumer() {
         final int[] result = {0};
 
-        populatedSortedStringArrayMap.forEach(new BiConsumer<String, Object>() {
-            @Override
-            public void accept(final String s, final Object o) {
-                result[0] += s.hashCode() + o.hashCode();
-            }
-        });
+        populatedSortedStringArrayMap.forEach((s, o) -> result[0] += s.hashCode() + o.hashCode());
         return result[0];
     }
 
@@ -185,12 +175,7 @@
     public int iterateHashContextDataBiConsumer() {
         final int[] result = {0};
 
-        populatedOpenHashContextData.forEach(new BiConsumer<String, Object>() {
-            @Override
-            public void accept(final String s, final Object o) {
-                result[0] += s.hashCode() + o.hashCode();
-            }
-        });
+        populatedOpenHashContextData.forEach((s, o) -> result[0] += s.hashCode() + o.hashCode());
         return result[0];
     }
 
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/StackWalkBenchmark.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/StackWalkBenchmark.java
index 15dcfb6..cd61fc5 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/StackWalkBenchmark.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/jmh/StackWalkBenchmark.java
@@ -83,22 +83,18 @@
 
     @Benchmark
     public void stackWalkerWalk(Blackhole bh) {
-        stackDriver.deepCall(initialDepth, callDepth, (fqcn) -> {
-            return walker.walk(
-                    s -> s.dropWhile(f -> !f.getClassName().equals(fqcn)) // drop the top frames until we reach the logger
-                            .dropWhile(f -> f.getClassName().equals(fqcn)) // drop the logger frames
-                            .findFirst())
-                    .get()
-                    .toStackTraceElement();
-        });
+        stackDriver.deepCall(initialDepth, callDepth, (fqcn) -> walker.walk(
+                s -> s.dropWhile(f -> !f.getClassName().equals(fqcn)) // drop the top frames until we reach the logger
+                        .dropWhile(f -> f.getClassName().equals(fqcn)) // drop the logger frames
+                        .findFirst())
+                .get()
+                .toStackTraceElement());
     }
 
     @Benchmark
     public void baseline(Blackhole bh)  {
 
-        stackDriver.deepCall(initialDepth, callDepth, (fqcn) -> {
-            return null;
-        });
+        stackDriver.deepCall(initialDepth, callDepth, (fqcn) -> null);
     }
 
     @Benchmark
diff --git a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nogc/OpenHashStringMap.java b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nogc/OpenHashStringMap.java
index c4ac559..f976869 100644
--- a/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nogc/OpenHashStringMap.java
+++ b/log4j-perf/src/main/java/org/apache/logging/log4j/perf/nogc/OpenHashStringMap.java
@@ -189,12 +189,7 @@
         }
     }
     private static final TriConsumer<String, Object, StringMap> PUT_ALL =
-            new TriConsumer<String, Object, StringMap>() {
-        @Override
-        public void accept(final String key, final Object value, final StringMap contextData) {
-            contextData.putValue(key, value);
-        }
-    };
+            (key, value, contextData) -> contextData.putValue(key, value);
 
     private void assertNotFrozen() {
         if (immutable) {
@@ -247,12 +242,7 @@
     }
 
     private static final TriConsumer<String, Object, Map<String, String>> COPY_INTO_MAP =
-            new TriConsumer<String, Object, Map<String, String>>() {
-        @Override
-        public void accept(final String k, final Object v, final Map<String, String> map) {
-            map.put(k, v == null ? null : v.toString());
-        }
-    };
+            (k, v, map) -> map.put(k, v == null ? null : v.toString());
 
     /*
      * Removes all elements from this map.
@@ -770,15 +760,12 @@
     }
 
     private static final TriConsumer<String, Object, ObjectOutputStream> SERIALIZER =
-            new TriConsumer<String, Object, ObjectOutputStream>() {
-                @Override
-                public void accept(final String k, final Object v, final ObjectOutputStream objectOutputStream) {
-                    try {
-                        objectOutputStream.writeObject(k);
-                        objectOutputStream.writeObject(v);
-                    } catch (final IOException ioex) {
-                        throw new IllegalStateException(ioex);
-                    }
+            (k, v, objectOutputStream) -> {
+                try {
+                    objectOutputStream.writeObject(k);
+                    objectOutputStream.writeObject(v);
+                } catch (final IOException ioex) {
+                    throw new IllegalStateException(ioex);
                 }
             };
 
diff --git a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginRegistry.java b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginRegistry.java
index bae5c8a..6cac60a 100644
--- a/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginRegistry.java
+++ b/log4j-plugins/src/main/java/org/apache/logging/log4j/plugins/util/PluginRegistry.java
@@ -309,10 +309,7 @@
         for (final Class<?> clazz : resolver.getClasses()) {
             final Plugin plugin = clazz.getAnnotation(Plugin.class);
             final String categoryLowerCase = plugin.category().toLowerCase();
-            List<PluginType<?>> list = newPluginsByCategory.get(categoryLowerCase);
-            if (list == null) {
-                newPluginsByCategory.put(categoryLowerCase, list = new ArrayList<>());
-            }
+            List<PluginType<?>> list = newPluginsByCategory.computeIfAbsent(categoryLowerCase, k -> new ArrayList<>());
             final PluginEntry mainEntry = new PluginEntry();
             final String mainElementName = plugin.elementType().equals(
                 Plugin.EMPTY) ? plugin.name() : plugin.elementType();
diff --git a/log4j-web/src/main/java/org/apache/logging/log4j/web/WebLoggerContextUtils.java b/log4j-web/src/main/java/org/apache/logging/log4j/web/WebLoggerContextUtils.java
index 4651f00..3ff0f05 100644
--- a/log4j-web/src/main/java/org/apache/logging/log4j/web/WebLoggerContextUtils.java
+++ b/log4j-web/src/main/java/org/apache/logging/log4j/web/WebLoggerContextUtils.java
@@ -101,16 +101,13 @@
      * @since 2.0.1
      */
     public static Runnable wrapExecutionContext(final ServletContext servletContext, final Runnable runnable) {
-        return new Runnable() {
-            @Override
-            public void run() {
-                final Log4jWebSupport webSupport = getWebLifeCycle(servletContext);
-                webSupport.setLoggerContext();
-                try {
-                    runnable.run();
-                } finally {
-                    webSupport.clearLoggerContext();
-                }
+        return () -> {
+            final Log4jWebSupport webSupport = getWebLifeCycle(servletContext);
+            webSupport.setLoggerContext();
+            try {
+                runnable.run();
+            } finally {
+                webSupport.clearLoggerContext();
             }
         };
     }
