Index: /trunk/src/org/openstreetmap/josm/tools/Predicate.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/Predicate.java	(revision 10581)
+++ /trunk/src/org/openstreetmap/josm/tools/Predicate.java	(revision 10582)
@@ -7,6 +7,9 @@
  * @param <T> The objects type
  * @since 3177
+ * @deprecated Use {@link java.util.function.Predicate} instead.
  */
-public interface Predicate<T> {
+@Deprecated
+@FunctionalInterface
+public interface Predicate<T> extends java.util.function.Predicate<T> {
 
     /**
@@ -16,3 +19,8 @@
      */
     boolean evaluate(T object);
+
+    @Override
+    default boolean test(T t) {
+        return evaluate(t);
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/tools/Predicates.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/Predicates.java	(revision 10581)
+++ /trunk/src/org/openstreetmap/josm/tools/Predicates.java	(revision 10582)
@@ -23,10 +23,5 @@
      */
     public static <T> Predicate<T> alwaysTrue() {
-        return new Predicate<T>() {
-            @Override
-            public boolean evaluate(T object) {
-                return true;
-            }
-        };
+        return o -> true;
     }
 
@@ -38,10 +33,5 @@
      */
     public static <T> Predicate<T> alwaysFalse() {
-        return new Predicate<T>() {
-            @Override
-            public boolean evaluate(T object) {
-                return false;
-            }
-        };
+        return o -> false;
     }
 
@@ -51,12 +41,9 @@
      * @param predicate the predicate to negate
      * @return the negation of {@code predicate}
+     * @deprecated Use {@link java.util.function.Predicate#negate()}
      */
+    @Deprecated
     public static <T> Predicate<T> not(final Predicate<T> predicate) {
-        return new Predicate<T>() {
-            @Override
-            public boolean evaluate(T obj) {
-                return !predicate.evaluate(obj);
-            }
-        };
+        return obj -> !predicate.evaluate(obj);
     }
 
@@ -68,10 +55,5 @@
      */
     public static <T> Predicate<T> equalTo(final T ref) {
-        return new Predicate<T>() {
-            @Override
-            public boolean evaluate(T obj) {
-                return Objects.equals(obj, ref);
-            }
-        };
+        return obj -> Objects.equals(obj, ref);
     }
 
@@ -85,10 +67,5 @@
     public static <T> Predicate<T> isOfClass(final Class<? extends T> clazz) {
         CheckParameterUtil.ensureParameterNotNull(clazz, "clazz");
-        return new Predicate<T>() {
-            @Override
-            public boolean evaluate(T obj) {
-                return obj != null && obj.getClass() == clazz;
-            }
-        };
+        return obj -> obj != null && obj.getClass() == clazz;
     }
 
@@ -103,10 +80,5 @@
     public static <T> Predicate<T> isInstanceOf(final Class<? extends T> clazz) {
         CheckParameterUtil.ensureParameterNotNull(clazz, "clazz");
-        return new Predicate<T>() {
-            @Override
-            public boolean evaluate(T o) {
-                return clazz.isInstance(o);
-            }
-        };
+        return o -> clazz.isInstance(o);
     }
 
@@ -117,10 +89,5 @@
      */
     public static Predicate<String> stringMatchesPattern(final Pattern pattern) {
-        return new Predicate<String>() {
-            @Override
-            public boolean evaluate(String string) {
-                return pattern.matcher(string).matches();
-            }
-        };
+        return string -> pattern.matcher(string).matches();
     }
 
@@ -131,10 +98,5 @@
      */
     public static Predicate<String> stringContainsPattern(final Pattern pattern) {
-        return new Predicate<String>() {
-            @Override
-            public boolean evaluate(String string) {
-                return pattern.matcher(string).find();
-            }
-        };
+        return string -> pattern.matcher(string).find();
     }
 
@@ -145,10 +107,5 @@
      */
     public static Predicate<String> stringContains(final String pattern) {
-        return new Predicate<String>() {
-            @Override
-            public boolean evaluate(String string) {
-                return string.contains(pattern);
-            }
-        };
+        return string -> string.contains(pattern);
     }
 
@@ -160,10 +117,5 @@
      */
     public static Predicate<OsmPrimitive> hasTag(final String key, final String... values) {
-        return new Predicate<OsmPrimitive>() {
-            @Override
-            public boolean evaluate(OsmPrimitive p) {
-                return p.hasTag(key, values);
-            }
-        };
+        return p -> p.hasTag(key, values);
     }
 
@@ -174,10 +126,5 @@
      */
     public static Predicate<OsmPrimitive> hasKey(final String key) {
-        return new Predicate<OsmPrimitive>() {
-            @Override
-            public boolean evaluate(OsmPrimitive p) {
-                return p.hasKey(key);
-            }
-        };
+        return p -> p.hasKey(key);
     }
 
@@ -189,10 +136,5 @@
      */
     public static <T> Predicate<T> inCollection(final Collection<? extends T> target) {
-        return new Predicate<T>() {
-            @Override
-            public boolean evaluate(T object) {
-                return target.contains(object);
-            }
-        };
+        return object -> target.contains(object);
     }
 
@@ -203,10 +145,5 @@
      */
     public static <T> Predicate<T> isNull() {
-        return new Predicate<T>() {
-            @Override
-            public boolean evaluate(T object) {
-                return object == null;
-            }
-        };
+        return object -> object == null;
     }
 
Index: /trunk/src/org/openstreetmap/josm/tools/SubclassFilteredCollection.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/SubclassFilteredCollection.java	(revision 10581)
+++ /trunk/src/org/openstreetmap/josm/tools/SubclassFilteredCollection.java	(revision 10582)
@@ -12,4 +12,6 @@
  * Lets you iterate through those elements of a given collection that satisfy a
  * certain condition (imposed by a predicate).
+ * <p>
+ * The behaviour of this class is undefined if the underlying collection is changed.
  * @param <S> element type of the underlying collection
  * @param <T> element type of filtered collection (and subclass of S). The predicate
@@ -20,5 +22,5 @@
 
     private final Collection<? extends S> collection;
-    private final Predicate<? super S> predicate;
+    private final java.util.function.Predicate<? super S> predicate;
     private int size = -1;
 
@@ -36,5 +38,5 @@
                 while (iterator.hasNext()) {
                     current = iterator.next();
-                    if (predicate.evaluate(current))
+                    if (predicate.test(current))
                         return;
                 }
@@ -70,6 +72,18 @@
      * @param collection The base collection to filter
      * @param predicate The predicate to use as filter
+     * @deprecated Use java predicates instead.
      */
+    @Deprecated
     public SubclassFilteredCollection(Collection<? extends S> collection, Predicate<? super S> predicate) {
+        this(collection, (java.util.function.Predicate<? super S>) predicate);
+    }
+
+    /**
+     * Constructs a new {@code SubclassFilteredCollection}.
+     * @param collection The base collection to filter
+     * @param predicate The predicate to use as filter
+     * @see #filter(Collection, java.util.function.Predicate) for an alternative way to construct this.
+     */
+    public SubclassFilteredCollection(Collection<? extends S> collection, java.util.function.Predicate<? super S> predicate) {
         this.collection = collection;
         this.predicate = predicate;
@@ -98,3 +112,14 @@
         return !iterator().hasNext();
     }
+
+    /**
+     * Create a new filtered collection without any constraints on the predicate type.
+     * @param <T> The collection type.
+     * @param collection The collection to filter.
+     * @param predicate The predicate to filter for.
+     * @return The filtered collection. It is a Collection<T>.
+     */
+    public static <T> SubclassFilteredCollection<T, T> filter(Collection<T> collection, java.util.function.Predicate<T> predicate) {
+        return new SubclassFilteredCollection<T, T>(collection, predicate);
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/tools/Utils.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/Utils.java	(revision 10581)
+++ /trunk/src/org/openstreetmap/josm/tools/Utils.java	(revision 10582)
@@ -58,4 +58,5 @@
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import java.util.stream.Stream;
 import java.util.zip.GZIPInputStream;
 import java.util.zip.ZipEntry;
@@ -105,4 +106,6 @@
     /**
      * Tests whether {@code predicate} applies to at least one element from {@code collection}.
+     * <p>
+     * Note: you can use {@link Stream#anyMatch(java.util.function.Predicate)} instead.
      * @param <T> type of items
      * @param collection the collection
@@ -121,4 +124,6 @@
     /**
      * Tests whether {@code predicate} applies to all elements from {@code collection}.
+     * <p>
+     * Note: you can use {@link Stream#allMatch(java.util.function.Predicate)} instead.
      * @param <T> type of items
      * @param collection the collection
@@ -175,5 +180,7 @@
      * @param predicate The predicate to filter for.
      * @return The new {@link FilteredCollection}
-     */
+     * @deprecated Use java predicates and {@link SubclassFilteredCollection#filter(Collection, java.util.function.Predicate)} instead.
+     */
+    @Deprecated
     @SuppressWarnings("unused")
     public static <T> Collection<T> filter(Collection<? extends T> collection, Predicate<? super T> predicate) {
@@ -798,5 +805,8 @@
      * @param <A> class of input objects
      * @param <B> class of transformed objects
-     */
+     *
+     * @deprecated Use java.util.function.Function instead.
+     */
+    @Deprecated
     public interface Function<A, B> {
 
