Java 8 improvements (#514)

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();
             }
         };
     }