You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by ro...@apache.org on 2017/10/18 23:25:54 UTC

[sling-org-apache-sling-query] 26/31: SLING-7149: Sling Query support for Java 8

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

rombert pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/sling-org-apache-sling-query.git

commit 4ec91e759acdea4b017e19b0e217cf8adba4f0a3
Author: Tomasz Rekawek <to...@apache.org>
AuthorDate: Mon Sep 25 10:14:15 2017 +0000

    SLING-7149: Sling Query support for Java 8
    
    git-svn-id: https://svn.apache.org/repos/asf/sling/trunk@1809597 13f79535-47bb-0310-9956-ffa450edef68
---
 pom.xml                                            |   8 +-
 .../java/org/apache/sling/query/AbstractQuery.java | 151 +++++++++++----------
 .../java/org/apache/sling/query/SlingQuery.java    |  10 +-
 .../java/org/apache/sling/query/api/Function.java  |  39 ------
 .../java/org/apache/sling/query/api/Predicate.java |  37 -----
 .../org/apache/sling/query/api/SearchStrategy.java |   4 +-
 .../api/internal/ElementToIteratorFunction.java    |   3 +-
 .../api/internal/IteratorToIteratorFunction.java   |   3 +-
 .../apache/sling/query/api/internal/Option.java    |   4 +-
 .../sling/query/api/internal/TreeProvider.java     |   5 +-
 .../org/apache/sling/query/api/package-info.java   |   5 +-
 .../apache/sling/query/function/AddFunction.java   |   2 +-
 .../sling/query/function/ClosestFunction.java      |   4 +-
 .../sling/query/function/CompositeFunction.java    |   2 +-
 .../sling/query/function/DescendantFunction.java   |   2 +-
 .../apache/sling/query/function/EvenFunction.java  |   6 +-
 .../sling/query/function/FilterFunction.java       |   4 +-
 .../apache/sling/query/function/FindFunction.java  |   4 +-
 .../apache/sling/query/function/HasFunction.java   |  10 +-
 .../IteratorToIteratorFunctionWrapper.java         |   4 +-
 .../apache/sling/query/function/LastFunction.java  |   2 +-
 .../apache/sling/query/function/NextFunction.java  |   4 +-
 .../apache/sling/query/function/NotFunction.java   |   2 +-
 .../sling/query/function/ParentsFunction.java      |   4 +-
 .../apache/sling/query/function/PrevFunction.java  |   4 +-
 .../apache/sling/query/function/SliceFunction.java |   4 +-
 .../sling/query/function/UniqueFunction.java       |   2 +-
 .../sling/query/iterator/FilteringIterator.java    |   4 +-
 .../sling/query/iterator/ParentsIterator.java      |   5 +-
 .../sling/query/iterator/SiblingsIterator.java     |   4 +-
 .../java/org/apache/sling/query/package-info.java  |   5 +-
 .../query/predicate/IterableContainsPredicate.java |   5 +-
 .../sling/query/predicate/ParentPredicate.java     |   5 +-
 .../sling/query/predicate/RejectingPredicate.java  |  13 +-
 .../sling/query/predicate/SelectorOperator.java    |   2 +-
 .../sling/query/resource/ResourcePredicate.java    |   8 +-
 .../query/resource/ResourcePropertyPredicate.java  |   5 +-
 .../sling/query/resource/ResourceTreeProvider.java |   2 +-
 .../sling/query/resource/jcr/JcrOperator.java      |   2 +-
 .../query/resource/jcr/query/JcrQueryBuilder.java  |   4 +-
 .../apache/sling/query/selector/FunctionType.java  |   7 +-
 .../sling/query/selector/HierarchyOperator.java    |   5 +-
 .../sling/query/selector/SelectorFunction.java     |  14 +-
 .../sling/query/selector/parser/Selector.java      |   2 +-
 .../query/selector/parser/SelectorSegment.java     |   4 +-
 .../java/org/apache/sling/query/FilterTest.java    |  17 +--
 46 files changed, 178 insertions(+), 264 deletions(-)

diff --git a/pom.xml b/pom.xml
index 8e81cf3..2e6017a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -22,13 +22,13 @@
     <parent>
         <groupId>org.apache.sling</groupId>
         <artifactId>sling</artifactId>
-        <version>26</version>
+        <version>32</version>
         <relativePath/>
     </parent>
 
     <modelVersion>4.0.0</modelVersion>
     <artifactId>org.apache.sling.query</artifactId>
-    <version>3.0.1-SNAPSHOT</version>
+    <version>4.0.0-SNAPSHOT</version>
     <packaging>bundle</packaging>
 
     <name>Apache Sling Query</name>
@@ -40,6 +40,10 @@
         <url>http://svn.apache.org/viewvc/sling/trunk/contrib/extensions/sling-query</url>
     </scm>
 
+    <properties>
+        <sling.java.version>8</sling.java.version>
+    </properties>
+
     <build>
         <plugins>
             <plugin>
diff --git a/src/main/java/org/apache/sling/query/AbstractQuery.java b/src/main/java/org/apache/sling/query/AbstractQuery.java
index 0ead8fe..88142a2 100644
--- a/src/main/java/org/apache/sling/query/AbstractQuery.java
+++ b/src/main/java/org/apache/sling/query/AbstractQuery.java
@@ -23,9 +23,11 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
+import java.util.function.Function;
+import java.util.function.Predicate;
+import java.util.stream.Stream;
+import java.util.stream.StreamSupport;
 
-import org.apache.sling.query.api.Function;
-import org.apache.sling.query.api.Predicate;
 import org.apache.sling.query.api.SearchStrategy;
 import org.apache.sling.query.api.internal.IteratorToIteratorFunction;
 import org.apache.sling.query.api.internal.Option;
@@ -55,13 +57,12 @@ import org.apache.sling.query.predicate.IterableContainsPredicate;
 import org.apache.sling.query.predicate.RejectingPredicate;
 import org.apache.sling.query.selector.SelectorFunction;
 import org.apache.sling.query.util.LazyList;
-
-import aQute.bnd.annotation.ProviderType;
+import org.osgi.annotation.versioning.ProviderType;
 
 @ProviderType
 public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements Iterable<T> {
 
-	protected final List<Function<?, ?>> functions = new ArrayList<Function<?, ?>>();
+	protected final List<Function<?, ?>> functions = new ArrayList<>();
 
 	private final List<T> initialCollection;
 
@@ -71,13 +72,13 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 
 	AbstractQuery(TreeProvider<T> provider, T[] initialCollection, SearchStrategy strategy) {
 		this.provider = provider;
-		this.initialCollection = new ArrayList<T>(Arrays.asList(initialCollection));
+		this.initialCollection = new ArrayList<>(Arrays.asList(initialCollection));
 		this.searchStrategy = strategy;
 	}
 
 	protected AbstractQuery(AbstractQuery<T, Q> original, SearchStrategy searchStrategy) {
 		this.functions.addAll(original.functions);
-		this.initialCollection = new ArrayList<T>(original.initialCollection);
+		this.initialCollection = new ArrayList<>(original.initialCollection);
 		this.searchStrategy = searchStrategy;
 		this.provider = original.provider;
 	}
@@ -87,20 +88,24 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 */
 	@Override
 	public Iterator<T> iterator() {
-		IteratorToIteratorFunction<T> f = new CompositeFunction<T>(functions);
-		Iterator<Option<T>> iterator = f.apply(new OptionDecoratingIterator<T>(initialCollection.iterator()));
-		iterator = new EmptyElementFilter<T>(iterator);
-		return new OptionStrippingIterator<T>(iterator);
+		IteratorToIteratorFunction<T> f = new CompositeFunction<>(functions);
+		Iterator<Option<T>> iterator = f.apply(new OptionDecoratingIterator<>(initialCollection.iterator()));
+		iterator = new EmptyElementFilter<>(iterator);
+		return new OptionStrippingIterator<>(iterator);
+	}
+
+	public Stream<T> stream() {
+		return StreamSupport.stream(this.spliterator(), false);
 	}
 
 	/**
 	 * Include resources to the collection.
 	 * 
-	 * @param iterable Resources to include
+	 * @param resources Resources to include
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q add(T... resources) {
-		return function(new AddFunction<T>(Arrays.asList(resources)));
+		return function(new AddFunction<>(Arrays.asList(resources)));
 	}
 
 	/**
@@ -110,7 +115,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q add(Iterable<T> iterable) {
-		return function(new AddFunction<T>(iterable));
+		return function(new AddFunction<>(iterable));
 	}
 
 	/**
@@ -119,7 +124,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return List containing all elements from the collection.
 	 */
 	public List<T> asList() {
-		return new LazyList<T>(iterator());
+		return new LazyList<>(iterator());
 	}
 
 	/**
@@ -128,7 +133,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q children() {
-		return function(new ChildrenFunction<T>(provider));
+		return function(new ChildrenFunction<>(provider));
 	}
 
 	/**
@@ -138,7 +143,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q children(String filter) {
-		return function(new ChildrenFunction<T>(provider), filter);
+		return function(new ChildrenFunction<>(provider), filter);
 	}
 
 	/**
@@ -148,7 +153,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q children(Predicate<T> filter) {
-		return function(new ChildrenFunction<T>(provider), filter);
+		return function(new ChildrenFunction<>(provider), filter);
 	}
 
 	/**
@@ -158,7 +163,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q children(Iterable<T> filter) {
-		return function(new ChildrenFunction<T>(provider), filter);
+		return function(new ChildrenFunction<>(provider), filter);
 	}
 
 	/**
@@ -180,18 +185,18 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q closest(Iterable<T> iterable) {
-		return closest(new IterableContainsPredicate<T>(iterable, provider));
+		return closest(new IterableContainsPredicate<>(iterable, provider));
 	}
 
 	/**
 	 * For each Resource in the collection, return the first element matching the selector testing the
 	 * Resource itself and traversing up its ancestors.
 	 * 
-	 * @param selector Ancestor filter
+	 * @param predicate Ancestor filter
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q closest(Predicate<T> predicate) {
-		return function(new ClosestFunction<T>(predicate, provider));
+		return function(new ClosestFunction<>(predicate, provider));
 	}
 
 	/**
@@ -221,7 +226,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q filter(Predicate<T> predicate) {
-		return function(new FilterFunction<T>(predicate));
+		return function(new FilterFunction<>(predicate));
 	}
 
 	/**
@@ -231,7 +236,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q filter(Iterable<T> iterable) {
-		return function(new FilterFunction<T>(new IterableContainsPredicate<T>(iterable, provider)));
+		return function(new FilterFunction<>(new IterableContainsPredicate<>(iterable, provider)));
 	}
 
 	/**
@@ -242,7 +247,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q find() {
-		return function(new FindFunction<T>(searchStrategy, provider, ""));
+		return function(new FindFunction<>(searchStrategy, provider, ""));
 	}
 
 	/**
@@ -254,7 +259,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q find(String selector) {
-		return function(new FindFunction<T>(searchStrategy, provider, selector), selector);
+		return function(new FindFunction<>(searchStrategy, provider, selector), selector);
 	}
 
 	/**
@@ -266,7 +271,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q find(Predicate<T> predicate) {
-		return function(new FindFunction<T>(searchStrategy, provider, ""), predicate);
+		return function(new FindFunction<>(searchStrategy, provider, ""), predicate);
 	}
 
 	/**
@@ -278,7 +283,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q find(Iterable<T> iterable) {
-		return function(new DescendantFunction<T>(new LazyList<T>(iterable.iterator()), provider));
+		return function(new DescendantFunction<>(new LazyList<>(iterable.iterator()), provider));
 	}
 
 	/**
@@ -297,7 +302,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q has(String selector) {
-		return function(new HasFunction<T>(selector, searchStrategy, provider));
+		return function(new HasFunction<>(selector, searchStrategy, provider));
 	}
 
 	/**
@@ -307,7 +312,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q has(Predicate<T> predicate) {
-		return function(new HasFunction<T>(predicate, searchStrategy, provider));
+		return function(new HasFunction<>(predicate, searchStrategy, provider));
 	}
 
 	/**
@@ -317,7 +322,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q has(Iterable<T> iterable) {
-		return function(new HasFunction<T>(iterable, provider));
+		return function(new HasFunction<>(iterable, provider));
 	}
 
 	/**
@@ -335,7 +340,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q next() {
-		return function(new NextFunction<T>(provider));
+		return function(new NextFunction<>(provider));
 	}
 
 	/**
@@ -346,7 +351,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q next(String selector) {
-		return function(new NextFunction<T>(provider), selector);
+		return function(new NextFunction<>(provider), selector);
 	}
 
 	/**
@@ -357,7 +362,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q next(Predicate<T> predicate) {
-		return function(new NextFunction<T>(provider), predicate);
+		return function(new NextFunction<>(provider), predicate);
 	}
 
 	/**
@@ -368,7 +373,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q next(Iterable<T> iterable) {
-		return function(new NextFunction<T>(provider), iterable);
+		return function(new NextFunction<>(provider), iterable);
 	}
 
 	/**
@@ -377,7 +382,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q nextAll() {
-		return function(new NextFunction<T>(new RejectingPredicate<T>(), provider));
+		return function(new NextFunction<>(new RejectingPredicate<>(), provider));
 	}
 
 	/**
@@ -387,7 +392,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q nextAll(String selector) {
-		return function(new NextFunction<T>(new RejectingPredicate<T>(), provider), selector);
+		return function(new NextFunction<>(new RejectingPredicate<>(), provider), selector);
 	}
 
 	/**
@@ -397,7 +402,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q nextAll(Predicate<T> predicate) {
-		return function(new NextFunction<T>(new RejectingPredicate<T>(), provider), predicate);
+		return function(new NextFunction<>(new RejectingPredicate<>(), provider), predicate);
 	}
 
 	/**
@@ -407,7 +412,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q nextAll(Iterable<T> iterable) {
-		return function(new NextFunction<T>(new RejectingPredicate<T>(), provider), iterable);
+		return function(new NextFunction<>(new RejectingPredicate<>(), provider), iterable);
 	}
 
 	/**
@@ -418,7 +423,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q nextUntil(String until) {
-		return function(new NextFunction<T>(parse(until), provider));
+		return function(new NextFunction<>(parse(until), provider));
 	}
 
 	/**
@@ -429,7 +434,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q nextUntil(Predicate<T> predicate) {
-		return function(new NextFunction<T>(predicate, provider));
+		return function(new NextFunction<>(predicate, provider));
 	}
 
 	/**
@@ -440,7 +445,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q nextUntil(Iterable<T> iterable) {
-		return nextUntil(new IterableContainsPredicate<T>(iterable, provider));
+		return nextUntil(new IterableContainsPredicate<>(iterable, provider));
 	}
 
 	/**
@@ -450,7 +455,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q not(String selector) {
-		return function(new NotFunction<T>(parse(selector)));
+		return function(new NotFunction<>(parse(selector)));
 	}
 
 	/**
@@ -460,7 +465,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q not(Predicate<T> predicate) {
-		return function(new FilterFunction<T>(new RejectingPredicate<T>(predicate)));
+		return function(new FilterFunction<>(new RejectingPredicate<>(predicate)));
 	}
 
 	/**
@@ -470,7 +475,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q not(Iterable<T> iterable) {
-		return not(new IterableContainsPredicate<T>(iterable, provider));
+		return not(new IterableContainsPredicate<>(iterable, provider));
 	}
 
 	/**
@@ -479,7 +484,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q parent() {
-		return function(new ParentFunction<T>(provider));
+		return function(new ParentFunction<>(provider));
 	}
 
 	/**
@@ -488,7 +493,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q parents() {
-		return function(new ParentsFunction<T>(new RejectingPredicate<T>(), provider));
+		return function(new ParentsFunction<>(new RejectingPredicate<>(), provider));
 	}
 
 	/**
@@ -498,7 +503,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q parents(String selector) {
-		return function(new ParentsFunction<T>(new RejectingPredicate<T>(), provider), selector);
+		return function(new ParentsFunction<>(new RejectingPredicate<>(), provider), selector);
 	}
 
 	/**
@@ -508,17 +513,17 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q parents(Predicate<T> predicate) {
-		return function(new ParentsFunction<T>(new RejectingPredicate<T>(), provider), predicate);
+		return function(new ParentsFunction<>(new RejectingPredicate<>(), provider), predicate);
 	}
 
 	/**
 	 * For each element in the collection find its all ancestor, filtered by a selector.
 	 * 
-	 * @param predicate Parents filter
+	 * @param iterable Parents filter
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q parents(Iterable<T> iterable) {
-		return function(new ParentsFunction<T>(new RejectingPredicate<T>(), provider), iterable);
+		return function(new ParentsFunction<>(new RejectingPredicate<>(), provider), iterable);
 	}
 
 	/**
@@ -528,7 +533,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q parentsUntil(String until) {
-		return function(new ParentsFunction<T>(parse(until), provider));
+		return function(new ParentsFunction<>(parse(until), provider));
 	}
 
 	/**
@@ -538,7 +543,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q parentsUntil(Predicate<T> predicate) {
-		return function(new ParentsFunction<T>(predicate, provider));
+		return function(new ParentsFunction<>(predicate, provider));
 	}
 
 	/**
@@ -548,7 +553,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q parentsUntil(Iterable<T> iterable) {
-		return parentsUntil(new IterableContainsPredicate<T>(iterable, provider));
+		return parentsUntil(new IterableContainsPredicate<>(iterable, provider));
 	}
 
 	/**
@@ -557,7 +562,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q prev() {
-		return function(new PrevFunction<T>(provider));
+		return function(new PrevFunction<>(provider));
 	}
 
 	/**
@@ -568,7 +573,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q prev(String selector) {
-		return function(new PrevFunction<T>(null, provider), selector);
+		return function(new PrevFunction<>(null, provider), selector);
 	}
 
 	/**
@@ -579,7 +584,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q prev(Predicate<T> predicate) {
-		return function(new PrevFunction<T>(null, provider), predicate);
+		return function(new PrevFunction<>(null, provider), predicate);
 	}
 
 	/**
@@ -590,7 +595,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q prev(Iterable<T> iterable) {
-		return function(new PrevFunction<T>(null, provider), iterable);
+		return function(new PrevFunction<>(null, provider), iterable);
 	}
 
 	/**
@@ -599,7 +604,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q prevAll() {
-		return function(new PrevFunction<T>(new RejectingPredicate<T>(), provider));
+		return function(new PrevFunction<>(new RejectingPredicate<>(), provider));
 	}
 
 	/**
@@ -609,7 +614,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q prevAll(String selector) {
-		return function(new PrevFunction<T>(new RejectingPredicate<T>(), provider), selector);
+		return function(new PrevFunction<>(new RejectingPredicate<>(), provider), selector);
 	}
 
 	/**
@@ -619,7 +624,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q prevAll(Predicate<T> predicate) {
-		return function(new PrevFunction<T>(new RejectingPredicate<T>(), provider), predicate);
+		return function(new PrevFunction<>(new RejectingPredicate<>(), provider), predicate);
 	}
 
 	/**
@@ -629,7 +634,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q prevAll(Iterable<T> iterable) {
-		return function(new PrevFunction<T>(new RejectingPredicate<T>(), provider), iterable);
+		return function(new PrevFunction<>(new RejectingPredicate<>(), provider), iterable);
 	}
 
 	/**
@@ -640,7 +645,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q prevUntil(String until) {
-		return function(new PrevFunction<T>(parse(until), provider));
+		return function(new PrevFunction<>(parse(until), provider));
 	}
 
 	/**
@@ -651,7 +656,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q prevUntil(Predicate<T> predicate) {
-		return function(new PrevFunction<T>(predicate, provider));
+		return function(new PrevFunction<>(predicate, provider));
 	}
 
 	/**
@@ -662,7 +667,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q prevUntil(Iterable<T> iterable) {
-		return prevUntil(new IterableContainsPredicate<T>(iterable, provider));
+		return prevUntil(new IterableContainsPredicate<>(iterable, provider));
 	}
 
 	/**
@@ -691,7 +696,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q siblings(String selector) {
-		return function(new SiblingsFunction<T>(provider), selector);
+		return function(new SiblingsFunction<>(provider), selector);
 	}
 
 	/**
@@ -701,7 +706,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q siblings(Predicate<T> predicate) {
-		return function(new SiblingsFunction<T>(provider), predicate);
+		return function(new SiblingsFunction<>(provider), predicate);
 	}
 
 	/**
@@ -711,7 +716,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q siblings(Iterable<T> iterable) {
-		return function(new SiblingsFunction<T>(provider), iterable);
+		return function(new SiblingsFunction<>(provider), iterable);
 	}
 
 	/**
@@ -751,27 +756,27 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	 * @return new SlingQuery object transformed by this operation
 	 */
 	public Q unique() {
-		return function(new UniqueFunction<T>(provider));
+		return function(new UniqueFunction<>(provider));
 	}
 
 	private Q function(Function<?, ?> function, Iterable<T> iterable) {
 		Q newQuery = clone(this, this.searchStrategy);
 		newQuery.functions.add(function);
-		newQuery.functions.add(new FilterFunction<T>(new IterableContainsPredicate<T>(iterable, provider)));
+		newQuery.functions.add(new FilterFunction<>(new IterableContainsPredicate<>(iterable, provider)));
 		return newQuery;
 	}
 
 	private Q function(Function<?, ?> function, Predicate<T> predicate) {
 		Q newQuery = clone(this, this.searchStrategy);
 		newQuery.functions.add(function);
-		newQuery.functions.add(new FilterFunction<T>(predicate));
+		newQuery.functions.add(new FilterFunction<>(predicate));
 		return newQuery;
 	}
 
 	private Q function(Function<?, ?> function, String selector) {
 		Q newQuery = clone(this, this.searchStrategy);
 		newQuery.functions.add(function);
-		newQuery.functions.add(new SelectorFunction<T>(selector, provider, searchStrategy));
+		newQuery.functions.add(new SelectorFunction<>(selector, provider, searchStrategy));
 		return newQuery;
 	}
 
@@ -782,7 +787,7 @@ public abstract class AbstractQuery<T, Q extends AbstractQuery<T, Q>> implements
 	}
 
 	private SelectorFunction<T> parse(String selector) {
-		return new SelectorFunction<T>(selector, provider, searchStrategy);
+		return new SelectorFunction<>(selector, provider, searchStrategy);
 	}
 
 	protected abstract Q clone(AbstractQuery<T, Q> original, SearchStrategy strategy);
diff --git a/src/main/java/org/apache/sling/query/SlingQuery.java b/src/main/java/org/apache/sling/query/SlingQuery.java
index 8b3cabd..ecfd59d 100644
--- a/src/main/java/org/apache/sling/query/SlingQuery.java
+++ b/src/main/java/org/apache/sling/query/SlingQuery.java
@@ -27,8 +27,7 @@ import org.apache.sling.api.resource.ResourceResolver;
 import org.apache.sling.query.api.SearchStrategy;
 import org.apache.sling.query.iterator.AdaptToIterator;
 import org.apache.sling.query.resource.ResourceTreeProvider;
-
-import aQute.bnd.annotation.ProviderType;
+import org.osgi.annotation.versioning.ProviderType;
 
 /**
  * SlingQuery is a Sling resource tree traversal tool inspired by the jQuery.
@@ -65,12 +64,7 @@ public class SlingQuery extends AbstractQuery<Resource, SlingQuery> {
 	 * @return new iterable containing succesfully adapted Resources
 	 */
 	public <E> Iterable<E> map(final Class<? extends E> clazz) {
-		return new Iterable<E>() {
-			@Override
-			public Iterator<E> iterator() {
-				return new AdaptToIterator<Resource, E>(SlingQuery.this.iterator(), clazz);
-			}
-		};
+		return () -> new AdaptToIterator<>(SlingQuery.this.iterator(), clazz);
 	}
 
 	@Override
diff --git a/src/main/java/org/apache/sling/query/api/Function.java b/src/main/java/org/apache/sling/query/api/Function.java
deleted file mode 100644
index 86f31e6..0000000
--- a/src/main/java/org/apache/sling/query/api/Function.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*-
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.sling.query.api;
-
-import aQute.bnd.annotation.ConsumerType;
-
-/**
- * Function can transform one value into another.
- * 
- * @param <F> Input type
- * @param <T> Output type
- */
-@ConsumerType
-public interface Function<F, T> {
-	/**
-	 * Take input F and transform it into output T.
-	 * 
-	 * @param input Input value
-	 * @return Output value
-	 */
-	T apply(F input);
-}
diff --git a/src/main/java/org/apache/sling/query/api/Predicate.java b/src/main/java/org/apache/sling/query/api/Predicate.java
deleted file mode 100644
index c562712..0000000
--- a/src/main/java/org/apache/sling/query/api/Predicate.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*-
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.sling.query.api;
-
-import aQute.bnd.annotation.ConsumerType;
-
-/**
- * ResourcePredicate determine true or false value for a given T.
- * 
- */
-@ConsumerType
-public interface Predicate<T> {
-	/**
-	 * Accept or reject given resource.
-	 * 
-	 * @param element Object to test
-	 * @return {@code true} or {@code false}
-	 */
-	boolean accepts(T element);
-}
diff --git a/src/main/java/org/apache/sling/query/api/SearchStrategy.java b/src/main/java/org/apache/sling/query/api/SearchStrategy.java
index 9b476cc..e8eb4df 100644
--- a/src/main/java/org/apache/sling/query/api/SearchStrategy.java
+++ b/src/main/java/org/apache/sling/query/api/SearchStrategy.java
@@ -19,9 +19,9 @@
 
 package org.apache.sling.query.api;
 
-import aQute.bnd.annotation.ProviderType;
+import org.osgi.annotation.versioning.ProviderType;
 
 @ProviderType
 public enum SearchStrategy {
-	BFS, DFS, QUERY;
+	BFS, DFS, QUERY
 }
diff --git a/src/main/java/org/apache/sling/query/api/internal/ElementToIteratorFunction.java b/src/main/java/org/apache/sling/query/api/internal/ElementToIteratorFunction.java
index a3bc9a8..2aea781 100644
--- a/src/main/java/org/apache/sling/query/api/internal/ElementToIteratorFunction.java
+++ b/src/main/java/org/apache/sling/query/api/internal/ElementToIteratorFunction.java
@@ -20,8 +20,7 @@
 package org.apache.sling.query.api.internal;
 
 import java.util.Iterator;
-
-import org.apache.sling.query.api.Function;
+import java.util.function.Function;
 
 public interface ElementToIteratorFunction<T> extends Function<T, Iterator<T>> {
 }
diff --git a/src/main/java/org/apache/sling/query/api/internal/IteratorToIteratorFunction.java b/src/main/java/org/apache/sling/query/api/internal/IteratorToIteratorFunction.java
index 07552ed..db909eb 100644
--- a/src/main/java/org/apache/sling/query/api/internal/IteratorToIteratorFunction.java
+++ b/src/main/java/org/apache/sling/query/api/internal/IteratorToIteratorFunction.java
@@ -20,8 +20,7 @@
 package org.apache.sling.query.api.internal;
 
 import java.util.Iterator;
-
-import org.apache.sling.query.api.Function;
+import java.util.function.Function;
 
 public interface IteratorToIteratorFunction<T> extends Function<Iterator<Option<T>>, Iterator<Option<T>>> {
 }
diff --git a/src/main/java/org/apache/sling/query/api/internal/Option.java b/src/main/java/org/apache/sling/query/api/internal/Option.java
index f737971..074e5ed 100644
--- a/src/main/java/org/apache/sling/query/api/internal/Option.java
+++ b/src/main/java/org/apache/sling/query/api/internal/Option.java
@@ -33,11 +33,11 @@ public class Option<T> {
 	}
 
 	public static <T> Option<T> of(T element, int argumentId) {
-		return new Option<T>(element, argumentId);
+		return new Option<>(element, argumentId);
 	}
 
 	public static <T> Option<T> empty(int argumentId) {
-		return new Option<T>(null, argumentId);
+		return new Option<>(null, argumentId);
 	}
 
 	public int getArgumentId() {
diff --git a/src/main/java/org/apache/sling/query/api/internal/TreeProvider.java b/src/main/java/org/apache/sling/query/api/internal/TreeProvider.java
index 82ad1f6..0e2d56f 100644
--- a/src/main/java/org/apache/sling/query/api/internal/TreeProvider.java
+++ b/src/main/java/org/apache/sling/query/api/internal/TreeProvider.java
@@ -21,12 +21,11 @@ package org.apache.sling.query.api.internal;
 
 import java.util.Iterator;
 import java.util.List;
+import java.util.function.Predicate;
 
-import org.apache.sling.query.api.Predicate;
 import org.apache.sling.query.selector.parser.Attribute;
 import org.apache.sling.query.selector.parser.SelectorSegment;
-
-import aQute.bnd.annotation.ConsumerType;
+import org.osgi.annotation.versioning.ConsumerType;
 
 @ConsumerType
 public interface TreeProvider<T> {
diff --git a/src/main/java/org/apache/sling/query/api/package-info.java b/src/main/java/org/apache/sling/query/api/package-info.java
index aca85ff..002f808 100644
--- a/src/main/java/org/apache/sling/query/api/package-info.java
+++ b/src/main/java/org/apache/sling/query/api/package-info.java
@@ -17,8 +17,7 @@
  * under the License.
  */
 
-@Version("3.0.0")
+@Version("4.0.0")
 package org.apache.sling.query.api;
 
-import aQute.bnd.annotation.Version;
-
+import org.osgi.annotation.versioning.Version;
\ No newline at end of file
diff --git a/src/main/java/org/apache/sling/query/function/AddFunction.java b/src/main/java/org/apache/sling/query/function/AddFunction.java
index 32a4cae..bc8af9e 100644
--- a/src/main/java/org/apache/sling/query/function/AddFunction.java
+++ b/src/main/java/org/apache/sling/query/function/AddFunction.java
@@ -37,7 +37,7 @@ public class AddFunction<T> implements IteratorToIteratorFunction<T> {
 	@SuppressWarnings("unchecked")
 	@Override
 	public Iterator<Option<T>> apply(Iterator<Option<T>> input) {
-		return new MergingIterator<Option<T>>(input, new OptionDecoratingIterator<T>(iterable.iterator()));
+		return new MergingIterator<>(input, new OptionDecoratingIterator<>(iterable.iterator()));
 	}
 
 }
diff --git a/src/main/java/org/apache/sling/query/function/ClosestFunction.java b/src/main/java/org/apache/sling/query/function/ClosestFunction.java
index 9297d92..7a6ba79 100644
--- a/src/main/java/org/apache/sling/query/function/ClosestFunction.java
+++ b/src/main/java/org/apache/sling/query/function/ClosestFunction.java
@@ -20,8 +20,8 @@
 package org.apache.sling.query.function;
 
 import java.util.Iterator;
+import java.util.function.Predicate;
 
-import org.apache.sling.query.api.Predicate;
 import org.apache.sling.query.api.internal.ElementToIteratorFunction;
 import org.apache.sling.query.api.internal.TreeProvider;
 import org.apache.sling.query.util.IteratorUtils;
@@ -41,7 +41,7 @@ public class ClosestFunction<T> implements ElementToIteratorFunction<T> {
 	public Iterator<T> apply(T resource) {
 		T current = resource;
 		while (current != null) {
-			if (predicate.accepts(current)) {
+			if (predicate.test(current)) {
 				return IteratorUtils.singleElementIterator(current);
 			}
 			current = provider.getParent(current);
diff --git a/src/main/java/org/apache/sling/query/function/CompositeFunction.java b/src/main/java/org/apache/sling/query/function/CompositeFunction.java
index 178baad..bb56143 100644
--- a/src/main/java/org/apache/sling/query/function/CompositeFunction.java
+++ b/src/main/java/org/apache/sling/query/function/CompositeFunction.java
@@ -21,8 +21,8 @@ package org.apache.sling.query.function;
 
 import java.util.Iterator;
 import java.util.List;
+import java.util.function.Function;
 
-import org.apache.sling.query.api.Function;
 import org.apache.sling.query.api.internal.IteratorToIteratorFunction;
 import org.apache.sling.query.api.internal.Option;
 
diff --git a/src/main/java/org/apache/sling/query/function/DescendantFunction.java b/src/main/java/org/apache/sling/query/function/DescendantFunction.java
index 1c95c23..32fc027 100644
--- a/src/main/java/org/apache/sling/query/function/DescendantFunction.java
+++ b/src/main/java/org/apache/sling/query/function/DescendantFunction.java
@@ -39,7 +39,7 @@ public class DescendantFunction<T> implements IteratorToIteratorFunction<T> {
 
 	@Override
 	public Iterator<Option<T>> apply(Iterator<Option<T>> input) {
-		return new DescendantsIterator<T>(input, descendants.iterator(), provider);
+		return new DescendantsIterator<>(input, descendants.iterator(), provider);
 	}
 
 }
diff --git a/src/main/java/org/apache/sling/query/function/EvenFunction.java b/src/main/java/org/apache/sling/query/function/EvenFunction.java
index 4a552bb..49dd394 100644
--- a/src/main/java/org/apache/sling/query/function/EvenFunction.java
+++ b/src/main/java/org/apache/sling/query/function/EvenFunction.java
@@ -20,8 +20,8 @@
 package org.apache.sling.query.function;
 
 import java.util.Iterator;
+import java.util.function.Predicate;
 
-import org.apache.sling.query.api.Predicate;
 import org.apache.sling.query.api.internal.IteratorToIteratorFunction;
 import org.apache.sling.query.api.internal.Option;
 import org.apache.sling.query.iterator.FilteringIterator;
@@ -36,7 +36,7 @@ public class EvenFunction<T> implements IteratorToIteratorFunction<T> {
 
 	@Override
 	public Iterator<Option<T>> apply(Iterator<Option<T>> resources) {
-		return new FilteringIterator<T>(resources, new EvenPredicate<T>(even));
+		return new FilteringIterator<>(resources, new EvenPredicate<>(even));
 	}
 
 	private static class EvenPredicate<T> implements Predicate<T> {
@@ -47,7 +47,7 @@ public class EvenFunction<T> implements IteratorToIteratorFunction<T> {
 		}
 
 		@Override
-		public boolean accepts(T element) {
+		public boolean test(T element) {
 			boolean oldAccept = accept;
 			accept = !accept;
 			return oldAccept;
diff --git a/src/main/java/org/apache/sling/query/function/FilterFunction.java b/src/main/java/org/apache/sling/query/function/FilterFunction.java
index edd6b22..03e52ed 100644
--- a/src/main/java/org/apache/sling/query/function/FilterFunction.java
+++ b/src/main/java/org/apache/sling/query/function/FilterFunction.java
@@ -20,8 +20,8 @@
 package org.apache.sling.query.function;
 
 import java.util.Iterator;
+import java.util.function.Predicate;
 
-import org.apache.sling.query.api.Predicate;
 import org.apache.sling.query.api.internal.IteratorToIteratorFunction;
 import org.apache.sling.query.api.internal.Option;
 import org.apache.sling.query.iterator.FilteringIterator;
@@ -36,7 +36,7 @@ public class FilterFunction<T> implements IteratorToIteratorFunction<T> {
 
 	@Override
 	public Iterator<Option<T>> apply(Iterator<Option<T>> input) {
-		return new FilteringIterator<T>(input, predicate);
+		return new FilteringIterator<>(input, predicate);
 	}
 
 }
diff --git a/src/main/java/org/apache/sling/query/function/FindFunction.java b/src/main/java/org/apache/sling/query/function/FindFunction.java
index 62a35de..468b299 100644
--- a/src/main/java/org/apache/sling/query/function/FindFunction.java
+++ b/src/main/java/org/apache/sling/query/function/FindFunction.java
@@ -67,9 +67,9 @@ public class FindFunction<T> implements ElementToIteratorFunction<T> {
 				break;
 			case DFS:
 			default:
-				iterator = new DfsTreeIterator<T>(input, provider);
+				iterator = new DfsTreeIterator<>(input, provider);
 				break;
 		}
-		return new WarningIterator<T>(iterator);
+		return new WarningIterator<>(iterator);
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/apache/sling/query/function/HasFunction.java b/src/main/java/org/apache/sling/query/function/HasFunction.java
index 056297d..46127be 100644
--- a/src/main/java/org/apache/sling/query/function/HasFunction.java
+++ b/src/main/java/org/apache/sling/query/function/HasFunction.java
@@ -20,8 +20,8 @@
 package org.apache.sling.query.function;
 
 import java.util.Iterator;
+import java.util.function.Predicate;
 
-import org.apache.sling.query.api.Predicate;
 import org.apache.sling.query.api.SearchStrategy;
 import org.apache.sling.query.api.internal.ElementToIteratorFunction;
 import org.apache.sling.query.api.internal.IteratorToIteratorFunction;
@@ -48,12 +48,12 @@ public class HasFunction<T> implements ElementToIteratorFunction<T> {
 	}
 
 	public HasFunction(Predicate<T> predicate, SearchStrategy searchStrategy, TreeProvider<T> provider) {
-		this(new FindFunction<T>(searchStrategy, provider, ""), new FilterFunction<T>(predicate));
+		this(new FindFunction<>(searchStrategy, provider, ""), new FilterFunction<T>(predicate));
 	}
 
 	public HasFunction(Iterable<T> iterable, TreeProvider<T> provider) {
-		this.findFunction = new DescendantFunction<T>(iterable, provider);
-		this.filter = new IdentityFunction<T>();
+		this.findFunction = new DescendantFunction<>(iterable, provider);
+		this.filter = new IdentityFunction<>();
 	}
 
 	@Override
@@ -61,7 +61,7 @@ public class HasFunction<T> implements ElementToIteratorFunction<T> {
 		Iterator<Option<T>> iterator = IteratorUtils.singleElementIterator(Option.of(input, 0));
 		iterator = findFunction.apply(iterator);
 		iterator = filter.apply(iterator);
-		if (new EmptyElementFilter<T>(iterator).hasNext()) {
+		if (new EmptyElementFilter<>(iterator).hasNext()) {
 			return IteratorUtils.singleElementIterator(input);
 		} else {
 			return IteratorUtils.emptyIterator();
diff --git a/src/main/java/org/apache/sling/query/function/IteratorToIteratorFunctionWrapper.java b/src/main/java/org/apache/sling/query/function/IteratorToIteratorFunctionWrapper.java
index 4d7ce3c..18368fe 100644
--- a/src/main/java/org/apache/sling/query/function/IteratorToIteratorFunctionWrapper.java
+++ b/src/main/java/org/apache/sling/query/function/IteratorToIteratorFunctionWrapper.java
@@ -20,8 +20,8 @@
 package org.apache.sling.query.function;
 
 import java.util.Iterator;
+import java.util.function.Function;
 
-import org.apache.sling.query.api.Function;
 import org.apache.sling.query.api.internal.ElementToIteratorFunction;
 import org.apache.sling.query.api.internal.IteratorToIteratorFunction;
 import org.apache.sling.query.api.internal.Option;
@@ -49,6 +49,6 @@ public class IteratorToIteratorFunctionWrapper<T> implements IteratorToIteratorF
 
 	private static <T> Iterator<Option<T>> getOptionIterator(ElementToIteratorFunction<T> function,
 			Iterator<Option<T>> parentIterator) {
-		return new ExpandingIterator<T>((ElementToIteratorFunction<T>) function, parentIterator);
+		return new ExpandingIterator<>(function, parentIterator);
 	}
 }
diff --git a/src/main/java/org/apache/sling/query/function/LastFunction.java b/src/main/java/org/apache/sling/query/function/LastFunction.java
index 83c0b08..a8d3161 100644
--- a/src/main/java/org/apache/sling/query/function/LastFunction.java
+++ b/src/main/java/org/apache/sling/query/function/LastFunction.java
@@ -29,7 +29,7 @@ public class LastFunction<T> implements IteratorToIteratorFunction<T> {
 
 	@Override
 	public Iterator<Option<T>> apply(Iterator<Option<T>> input) {
-		return new LastIterator<T>(input);
+		return new LastIterator<>(input);
 	}
 
 }
diff --git a/src/main/java/org/apache/sling/query/function/NextFunction.java b/src/main/java/org/apache/sling/query/function/NextFunction.java
index 21e829c..93a720a 100644
--- a/src/main/java/org/apache/sling/query/function/NextFunction.java
+++ b/src/main/java/org/apache/sling/query/function/NextFunction.java
@@ -20,8 +20,8 @@
 package org.apache.sling.query.function;
 
 import java.util.Iterator;
+import java.util.function.Predicate;
 
-import org.apache.sling.query.api.Predicate;
 import org.apache.sling.query.api.internal.ElementToIteratorFunction;
 import org.apache.sling.query.api.internal.TreeProvider;
 import org.apache.sling.query.iterator.SiblingsIterator;
@@ -44,6 +44,6 @@ public class NextFunction<T> implements ElementToIteratorFunction<T> {
 
 	@Override
 	public Iterator<T> apply(T resource) {
-		return new SiblingsIterator<T>(until, resource, Type.NEXT, provider);
+		return new SiblingsIterator<>(until, resource, Type.NEXT, provider);
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/apache/sling/query/function/NotFunction.java b/src/main/java/org/apache/sling/query/function/NotFunction.java
index 0447592..e0f8e6c 100644
--- a/src/main/java/org/apache/sling/query/function/NotFunction.java
+++ b/src/main/java/org/apache/sling/query/function/NotFunction.java
@@ -35,7 +35,7 @@ public class NotFunction<T> implements IteratorToIteratorFunction<T> {
 
 	@Override
 	public Iterator<Option<T>> apply(Iterator<Option<T>> input) {
-		return new ReverseIterator<T>(function, input);
+		return new ReverseIterator<>(function, input);
 	}
 
 }
diff --git a/src/main/java/org/apache/sling/query/function/ParentsFunction.java b/src/main/java/org/apache/sling/query/function/ParentsFunction.java
index 8c3a8fc..5e10757 100644
--- a/src/main/java/org/apache/sling/query/function/ParentsFunction.java
+++ b/src/main/java/org/apache/sling/query/function/ParentsFunction.java
@@ -20,8 +20,8 @@
 package org.apache.sling.query.function;
 
 import java.util.Iterator;
+import java.util.function.Predicate;
 
-import org.apache.sling.query.api.Predicate;
 import org.apache.sling.query.api.internal.ElementToIteratorFunction;
 import org.apache.sling.query.api.internal.TreeProvider;
 import org.apache.sling.query.iterator.ParentsIterator;
@@ -39,7 +39,7 @@ public class ParentsFunction<T> implements ElementToIteratorFunction<T> {
 
 	@Override
 	public Iterator<T> apply(T resource) {
-		return new ParentsIterator<T>(until, resource, provider);
+		return new ParentsIterator<>(until, resource, provider);
 	}
 
 }
diff --git a/src/main/java/org/apache/sling/query/function/PrevFunction.java b/src/main/java/org/apache/sling/query/function/PrevFunction.java
index 81d26ad..e7bc782 100644
--- a/src/main/java/org/apache/sling/query/function/PrevFunction.java
+++ b/src/main/java/org/apache/sling/query/function/PrevFunction.java
@@ -20,8 +20,8 @@
 package org.apache.sling.query.function;
 
 import java.util.Iterator;
+import java.util.function.Predicate;
 
-import org.apache.sling.query.api.Predicate;
 import org.apache.sling.query.api.internal.ElementToIteratorFunction;
 import org.apache.sling.query.api.internal.TreeProvider;
 import org.apache.sling.query.iterator.SiblingsIterator;
@@ -44,6 +44,6 @@ public class PrevFunction<T> implements ElementToIteratorFunction<T> {
 
 	@Override
 	public Iterator<T> apply(T resource) {
-		return new SiblingsIterator<T>(until, resource, Type.PREV, provider);
+		return new SiblingsIterator<>(until, resource, Type.PREV, provider);
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/apache/sling/query/function/SliceFunction.java b/src/main/java/org/apache/sling/query/function/SliceFunction.java
index e28ef82..e1d7b80 100644
--- a/src/main/java/org/apache/sling/query/function/SliceFunction.java
+++ b/src/main/java/org/apache/sling/query/function/SliceFunction.java
@@ -44,9 +44,9 @@ public class SliceFunction<T> implements IteratorToIteratorFunction<T> {
 	@Override
 	public Iterator<Option<T>> apply(Iterator<Option<T>> resources) {
 		if (to == null) {
-			return new SliceIterator<T>(resources, from);
+			return new SliceIterator<>(resources, from);
 		} else {
-			return new SliceIterator<T>(resources, from, to);
+			return new SliceIterator<>(resources, from, to);
 		}
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/apache/sling/query/function/UniqueFunction.java b/src/main/java/org/apache/sling/query/function/UniqueFunction.java
index 67ee800..b9a95d3 100644
--- a/src/main/java/org/apache/sling/query/function/UniqueFunction.java
+++ b/src/main/java/org/apache/sling/query/function/UniqueFunction.java
@@ -36,7 +36,7 @@ public class UniqueFunction<T> implements IteratorToIteratorFunction<T> {
 
 	@Override
 	public Iterator<Option<T>> apply(Iterator<Option<T>> input) {
-		return new UniqueIterator<T>(input, treeProvider);
+		return new UniqueIterator<>(input, treeProvider);
 	}
 
 }
diff --git a/src/main/java/org/apache/sling/query/iterator/FilteringIterator.java b/src/main/java/org/apache/sling/query/iterator/FilteringIterator.java
index 1f77c3d..3569aa3 100644
--- a/src/main/java/org/apache/sling/query/iterator/FilteringIterator.java
+++ b/src/main/java/org/apache/sling/query/iterator/FilteringIterator.java
@@ -20,8 +20,8 @@
 package org.apache.sling.query.iterator;
 
 import java.util.Iterator;
+import java.util.function.Predicate;
 
-import org.apache.sling.query.api.Predicate;
 import org.apache.sling.query.api.internal.Option;
 
 public class FilteringIterator<T> extends AbstractIterator<Option<T>> {
@@ -39,7 +39,7 @@ public class FilteringIterator<T> extends AbstractIterator<Option<T>> {
 	protected Option<T> getElement() {
 		while (iterator.hasNext()) {
 			Option<T> element = iterator.next();
-			if (element.isEmpty() || predicate.accepts(element.getElement())) {
+			if (element.isEmpty() || predicate.test(element.getElement())) {
 				return element;
 			} else {
 				return Option.empty(element.getArgumentId());
diff --git a/src/main/java/org/apache/sling/query/iterator/ParentsIterator.java b/src/main/java/org/apache/sling/query/iterator/ParentsIterator.java
index 8dbf651..d92fc9a 100644
--- a/src/main/java/org/apache/sling/query/iterator/ParentsIterator.java
+++ b/src/main/java/org/apache/sling/query/iterator/ParentsIterator.java
@@ -19,9 +19,10 @@
 
 package org.apache.sling.query.iterator;
 
-import org.apache.sling.query.api.Predicate;
 import org.apache.sling.query.api.internal.TreeProvider;
 
+import java.util.function.Predicate;
+
 public class ParentsIterator<T> extends AbstractIterator<T> {
 
 	private final Predicate<T> until;
@@ -47,7 +48,7 @@ public class ParentsIterator<T> extends AbstractIterator<T> {
 			return null;
 		}
 
-		if (until != null && until.accepts(currentResource)) {
+		if (until != null && until.test(currentResource)) {
 			return null;
 		}
 
diff --git a/src/main/java/org/apache/sling/query/iterator/SiblingsIterator.java b/src/main/java/org/apache/sling/query/iterator/SiblingsIterator.java
index a20860b..6922aaf 100644
--- a/src/main/java/org/apache/sling/query/iterator/SiblingsIterator.java
+++ b/src/main/java/org/apache/sling/query/iterator/SiblingsIterator.java
@@ -21,8 +21,8 @@ package org.apache.sling.query.iterator;
 
 import java.util.Iterator;
 import java.util.ListIterator;
+import java.util.function.Predicate;
 
-import org.apache.sling.query.api.Predicate;
 import org.apache.sling.query.api.internal.TreeProvider;
 import org.apache.sling.query.util.IteratorUtils;
 import org.apache.sling.query.util.LazyList;
@@ -54,7 +54,7 @@ public class SiblingsIterator<T> extends AbstractIterator<T> {
 		}
 		while (type.canAdvance(siblings)) {
 			T resource = type.advance(siblings);
-			if (until != null && until.accepts(resource)) {
+			if (until != null && until.test(resource)) {
 				finished = true;
 				return null;
 			}
diff --git a/src/main/java/org/apache/sling/query/package-info.java b/src/main/java/org/apache/sling/query/package-info.java
index eff0363..3a5b82f 100644
--- a/src/main/java/org/apache/sling/query/package-info.java
+++ b/src/main/java/org/apache/sling/query/package-info.java
@@ -17,8 +17,7 @@
  * under the License.
  */
 
-@Version("3.0.0")
+@Version("4.0.0")
 package org.apache.sling.query;
 
-import aQute.bnd.annotation.Version;
-
+import org.osgi.annotation.versioning.Version;
\ No newline at end of file
diff --git a/src/main/java/org/apache/sling/query/predicate/IterableContainsPredicate.java b/src/main/java/org/apache/sling/query/predicate/IterableContainsPredicate.java
index 297c288..6dff33a 100644
--- a/src/main/java/org/apache/sling/query/predicate/IterableContainsPredicate.java
+++ b/src/main/java/org/apache/sling/query/predicate/IterableContainsPredicate.java
@@ -19,10 +19,11 @@
 
 package org.apache.sling.query.predicate;
 
-import org.apache.sling.query.api.Predicate;
 import org.apache.sling.query.api.internal.TreeProvider;
 import org.apache.sling.query.util.LazyList;
 
+import java.util.function.Predicate;
+
 public class IterableContainsPredicate<T> implements Predicate<T> {
 
 	private final Iterable<T> iterable;
@@ -35,7 +36,7 @@ public class IterableContainsPredicate<T> implements Predicate<T> {
 	}
 
 	@Override
-	public boolean accepts(T element) {
+	public boolean test(T element) {
 		for (T t : iterable) {
 			if (provider.sameElement(t, element)) {
 				return true;
diff --git a/src/main/java/org/apache/sling/query/predicate/ParentPredicate.java b/src/main/java/org/apache/sling/query/predicate/ParentPredicate.java
index 412be5f..02b35f8 100644
--- a/src/main/java/org/apache/sling/query/predicate/ParentPredicate.java
+++ b/src/main/java/org/apache/sling/query/predicate/ParentPredicate.java
@@ -19,9 +19,10 @@
 
 package org.apache.sling.query.predicate;
 
-import org.apache.sling.query.api.Predicate;
 import org.apache.sling.query.api.internal.TreeProvider;
 
+import java.util.function.Predicate;
+
 public class ParentPredicate<T> implements Predicate<T> {
 
 	private final TreeProvider<T> provider;
@@ -31,7 +32,7 @@ public class ParentPredicate<T> implements Predicate<T> {
 	}
 
 	@Override
-	public boolean accepts(T resource) {
+	public boolean test(T resource) {
 		return provider.listChildren(resource).hasNext();
 	}
 
diff --git a/src/main/java/org/apache/sling/query/predicate/RejectingPredicate.java b/src/main/java/org/apache/sling/query/predicate/RejectingPredicate.java
index 67f4f5d..60c6b20 100644
--- a/src/main/java/org/apache/sling/query/predicate/RejectingPredicate.java
+++ b/src/main/java/org/apache/sling/query/predicate/RejectingPredicate.java
@@ -19,19 +19,14 @@
 
 package org.apache.sling.query.predicate;
 
-import org.apache.sling.query.api.Predicate;
+import java.util.function.Predicate;
 
 public class RejectingPredicate<T> implements Predicate<T> {
 
 	private final Predicate<T> predicate;
 
 	public RejectingPredicate() {
-		this(new Predicate<T>() {
-			@Override
-			public boolean accepts(T resource) {
-				return true;
-			}
-		});
+		this(resource -> true);
 	}
 
 	public RejectingPredicate(Predicate<T> predicate) {
@@ -39,7 +34,7 @@ public class RejectingPredicate<T> implements Predicate<T> {
 	}
 
 	@Override
-	public boolean accepts(T value) {
-		return !predicate.accepts(value);
+	public boolean test(T value) {
+		return !predicate.test(value);
 	}
 }
diff --git a/src/main/java/org/apache/sling/query/predicate/SelectorOperator.java b/src/main/java/org/apache/sling/query/predicate/SelectorOperator.java
index 52a452e..459424f 100644
--- a/src/main/java/org/apache/sling/query/predicate/SelectorOperator.java
+++ b/src/main/java/org/apache/sling/query/predicate/SelectorOperator.java
@@ -65,7 +65,7 @@ public enum SelectorOperator {
 
 	private final String operator;
 
-	private SelectorOperator(String operator) {
+	SelectorOperator(String operator) {
 		this.operator = operator;
 	}
 
diff --git a/src/main/java/org/apache/sling/query/resource/ResourcePredicate.java b/src/main/java/org/apache/sling/query/resource/ResourcePredicate.java
index d766478..2c8828c 100644
--- a/src/main/java/org/apache/sling/query/resource/ResourcePredicate.java
+++ b/src/main/java/org/apache/sling/query/resource/ResourcePredicate.java
@@ -21,13 +21,13 @@ package org.apache.sling.query.resource;
 
 import java.util.ArrayList;
 import java.util.List;
+import java.util.function.Predicate;
 
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 
 import org.apache.commons.lang.StringUtils;
 import org.apache.sling.api.resource.Resource;
-import org.apache.sling.query.api.Predicate;
 import org.apache.sling.query.resource.jcr.JcrTypeResolver;
 import org.apache.sling.query.selector.parser.Attribute;
 import org.slf4j.Logger;
@@ -49,7 +49,7 @@ public class ResourcePredicate implements Predicate<Resource> {
 			JcrTypeResolver typeResolver) {
 		this.resourceType = resourceType;
 		this.resourceName = resourceName;
-		this.subPredicates = new ArrayList<Predicate<Resource>>();
+		this.subPredicates = new ArrayList<>();
 		for (Attribute a : attributes) {
 			subPredicates.add(new ResourcePropertyPredicate(a));
 		}
@@ -57,7 +57,7 @@ public class ResourcePredicate implements Predicate<Resource> {
 	}
 
 	@Override
-	public boolean accepts(Resource resource) {
+	public boolean test(Resource resource) {
 		if (StringUtils.isNotBlank(resourceName) && !resource.getName().equals(resourceName)) {
 			return false;
 		}
@@ -65,7 +65,7 @@ public class ResourcePredicate implements Predicate<Resource> {
 			return false;
 		}
 		for (Predicate<Resource> predicate : subPredicates) {
-			if (!predicate.accepts(resource)) {
+			if (!predicate.test(resource)) {
 				return false;
 			}
 		}
diff --git a/src/main/java/org/apache/sling/query/resource/ResourcePropertyPredicate.java b/src/main/java/org/apache/sling/query/resource/ResourcePropertyPredicate.java
index 356c332..f892c44 100644
--- a/src/main/java/org/apache/sling/query/resource/ResourcePropertyPredicate.java
+++ b/src/main/java/org/apache/sling/query/resource/ResourcePropertyPredicate.java
@@ -20,10 +20,11 @@
 package org.apache.sling.query.resource;
 
 import org.apache.sling.api.resource.Resource;
-import org.apache.sling.query.api.Predicate;
 import org.apache.sling.query.predicate.SelectorOperator;
 import org.apache.sling.query.selector.parser.Attribute;
 
+import java.util.function.Predicate;
+
 public class ResourcePropertyPredicate implements Predicate<Resource> {
 	private final String key;
 
@@ -38,7 +39,7 @@ public class ResourcePropertyPredicate implements Predicate<Resource> {
 	}
 
 	@Override
-	public boolean accepts(Resource resource) {
+	public boolean test(Resource resource) {
 		Resource property = resource.getChild(key);
 		if (property == null) {
 			return false;
diff --git a/src/main/java/org/apache/sling/query/resource/ResourceTreeProvider.java b/src/main/java/org/apache/sling/query/resource/ResourceTreeProvider.java
index 25d63eb..5ab9ac5 100644
--- a/src/main/java/org/apache/sling/query/resource/ResourceTreeProvider.java
+++ b/src/main/java/org/apache/sling/query/resource/ResourceTreeProvider.java
@@ -21,10 +21,10 @@ package org.apache.sling.query.resource;
 
 import java.util.Iterator;
 import java.util.List;
+import java.util.function.Predicate;
 
 import org.apache.sling.api.resource.Resource;
 import org.apache.sling.api.resource.ResourceResolver;
-import org.apache.sling.query.api.Predicate;
 import org.apache.sling.query.api.internal.TreeProvider;
 import org.apache.sling.query.resource.jcr.JcrQueryIterator;
 import org.apache.sling.query.resource.jcr.JcrTypeResolver;
diff --git a/src/main/java/org/apache/sling/query/resource/jcr/JcrOperator.java b/src/main/java/org/apache/sling/query/resource/jcr/JcrOperator.java
index a585b21..6caed18 100644
--- a/src/main/java/org/apache/sling/query/resource/jcr/JcrOperator.java
+++ b/src/main/java/org/apache/sling/query/resource/jcr/JcrOperator.java
@@ -59,7 +59,7 @@ public enum JcrOperator {
 
 	private final String operator;
 
-	private JcrOperator(String operator) {
+	JcrOperator(String operator) {
 		this.operator = operator;
 	}
 
diff --git a/src/main/java/org/apache/sling/query/resource/jcr/query/JcrQueryBuilder.java b/src/main/java/org/apache/sling/query/resource/jcr/query/JcrQueryBuilder.java
index fd52900..cdcc510 100644
--- a/src/main/java/org/apache/sling/query/resource/jcr/query/JcrQueryBuilder.java
+++ b/src/main/java/org/apache/sling/query/resource/jcr/query/JcrQueryBuilder.java
@@ -90,7 +90,7 @@ public class JcrQueryBuilder {
 	}
 
 	private static Formula prepareAlternativeConditions(List<SelectorSegment> segments) {
-		List<Term> list = new ArrayList<Term>();
+		List<Term> list = new ArrayList<>();
 		for (SelectorSegment segment : segments) {
 			Formula conditions = prepareSegmentConditions(segment.getType(), segment.getName(),
 					segment.getAttributes());
@@ -107,7 +107,7 @@ public class JcrQueryBuilder {
 
 	private static Formula prepareSegmentConditions(String resourceType, String resourceName,
 			List<Attribute> attributes) {
-		List<Term> conditions = new ArrayList<Term>();
+		List<Term> conditions = new ArrayList<>();
 		if (StringUtils.isNotBlank(resourceType) && !StringUtils.contains(resourceType, ':')) {
 			conditions.add(new Atomic(String.format("s.[sling:resourceType] = '%s'", resourceType)));
 		}
diff --git a/src/main/java/org/apache/sling/query/selector/FunctionType.java b/src/main/java/org/apache/sling/query/selector/FunctionType.java
index 5c1c1fb..0183455 100644
--- a/src/main/java/org/apache/sling/query/selector/FunctionType.java
+++ b/src/main/java/org/apache/sling/query/selector/FunctionType.java
@@ -19,7 +19,6 @@
 
 package org.apache.sling.query.selector;
 
-import org.apache.sling.query.api.Function;
 import org.apache.sling.query.api.SearchStrategy;
 import org.apache.sling.query.api.internal.TreeProvider;
 import org.apache.sling.query.function.EvenFunction;
@@ -31,11 +30,13 @@ import org.apache.sling.query.function.SliceFunction;
 import org.apache.sling.query.predicate.ParentPredicate;
 import org.apache.sling.query.predicate.RejectingPredicate;
 
+import java.util.function.Function;
+
 public enum FunctionType {
 	EQ {
 		@Override
 		public <T> Function<?, ?> getFunction(String argument, SearchStrategy strategy,
-				TreeProvider<T> providerw) {
+				TreeProvider<T> provider) {
 			int index = Integer.parseInt(argument);
 			return new SliceFunction<T>(index, index);
 		}
@@ -71,7 +72,7 @@ public enum FunctionType {
 	HAS {
 		@Override
 		public <T> Function<?, ?> getFunction(String selector, SearchStrategy strategy,
-				TreeProvider<T> provider) {
+											  TreeProvider<T> provider) {
 			return new HasFunction<T>(selector, strategy, provider);
 		}
 	},
diff --git a/src/main/java/org/apache/sling/query/selector/HierarchyOperator.java b/src/main/java/org/apache/sling/query/selector/HierarchyOperator.java
index 8146349..182f946 100644
--- a/src/main/java/org/apache/sling/query/selector/HierarchyOperator.java
+++ b/src/main/java/org/apache/sling/query/selector/HierarchyOperator.java
@@ -19,7 +19,6 @@
 
 package org.apache.sling.query.selector;
 
-import org.apache.sling.query.api.Function;
 import org.apache.sling.query.api.SearchStrategy;
 import org.apache.sling.query.api.internal.TreeProvider;
 import org.apache.sling.query.function.ChildrenFunction;
@@ -29,6 +28,8 @@ import org.apache.sling.query.function.NextFunction;
 import org.apache.sling.query.predicate.RejectingPredicate;
 import org.apache.sling.query.selector.parser.SelectorSegment;
 
+import java.util.function.Function;
+
 public enum HierarchyOperator {
 //@formatter:off
 	CHILD('>') {
@@ -70,7 +71,7 @@ public enum HierarchyOperator {
 	}
 
 	public abstract <T> Function<?, ?> getFunction(SelectorSegment segment, SearchStrategy strategy,
-			TreeProvider<T> provider);
+												   TreeProvider<T> provider);
 
 	public static HierarchyOperator findByCharacter(char c) {
 		for (HierarchyOperator operator : values()) {
diff --git a/src/main/java/org/apache/sling/query/selector/SelectorFunction.java b/src/main/java/org/apache/sling/query/selector/SelectorFunction.java
index 3147bd9..721846a 100644
--- a/src/main/java/org/apache/sling/query/selector/SelectorFunction.java
+++ b/src/main/java/org/apache/sling/query/selector/SelectorFunction.java
@@ -22,9 +22,9 @@ package org.apache.sling.query.selector;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.function.Function;
+import java.util.function.Predicate;
 
-import org.apache.sling.query.api.Function;
-import org.apache.sling.query.api.Predicate;
 import org.apache.sling.query.api.SearchStrategy;
 import org.apache.sling.query.api.internal.IteratorToIteratorFunction;
 import org.apache.sling.query.api.internal.Option;
@@ -53,7 +53,7 @@ public class SelectorFunction<T> implements IteratorToIteratorFunction<T>, Predi
 		this.provider = provider;
 		this.strategy = strategy;
 		List<Selector> selectors = SelectorParser.parse(selector);
-		selectorFunctions = new ArrayList<IteratorToIteratorFunction<T>>();
+		selectorFunctions = new ArrayList<>();
 		for (Selector s : selectors) {
 			selectorFunctions.add(createSelectorFunction(s.getSegments()));
 		}
@@ -62,7 +62,7 @@ public class SelectorFunction<T> implements IteratorToIteratorFunction<T>, Predi
 	@Override
 	public Iterator<Option<T>> apply(Iterator<Option<T>> input) {
 		LazyList<Option<T>> list = new LazyList<Option<T>>(input);
-		List<Iterator<Option<T>>> iterators = new ArrayList<Iterator<Option<T>>>();
+		List<Iterator<Option<T>>> iterators = new ArrayList<>();
 		for (IteratorToIteratorFunction<T> function : selectorFunctions) {
 			iterators.add(new SuppIterator<T>(list, function));
 		}
@@ -70,13 +70,13 @@ public class SelectorFunction<T> implements IteratorToIteratorFunction<T>, Predi
 	}
 
 	@Override
-	public boolean accepts(T resource) {
+	public boolean test(T resource) {
 		Iterator<Option<T>> result = apply(IteratorUtils.singleElementIterator(Option.of(resource, 0)));
 		return new EmptyElementFilter<T>(result).hasNext();
 	}
 
 	private IteratorToIteratorFunction<T> createSelectorFunction(List<SelectorSegment> segments) {
-		List<Function<?, ?>> segmentFunctions = new ArrayList<Function<?, ?>>();
+		List<Function<?, ?>> segmentFunctions = new ArrayList<>();
 		for (SelectorSegment segment : segments) {
 			segmentFunctions.addAll(createSegmentFunction(segment));
 		}
@@ -84,7 +84,7 @@ public class SelectorFunction<T> implements IteratorToIteratorFunction<T>, Predi
 	}
 
 	private List<Function<?, ?>> createSegmentFunction(SelectorSegment segment) {
-		List<Function<?, ?>> functions = new ArrayList<Function<?, ?>>();
+		List<Function<?, ?>> functions = new ArrayList<>();
 		HierarchyOperator operator = HierarchyOperator.findByCharacter(segment.getHierarchyOperator());
 		functions.add(operator.getFunction(segment, strategy, provider));
 		Predicate<T> predicate = provider.getPredicate(segment.getType(), segment.getName(),
diff --git a/src/main/java/org/apache/sling/query/selector/parser/Selector.java b/src/main/java/org/apache/sling/query/selector/parser/Selector.java
index 817c2b7..079273a 100644
--- a/src/main/java/org/apache/sling/query/selector/parser/Selector.java
+++ b/src/main/java/org/apache/sling/query/selector/parser/Selector.java
@@ -31,7 +31,7 @@ public class Selector {
 	}
 
 	public Selector(List<SelectorSegment> segments) {
-		this.segments = new ArrayList<SelectorSegment>(segments);
+		this.segments = new ArrayList<>(segments);
 	}
 
 	public List<SelectorSegment> getSegments() {
diff --git a/src/main/java/org/apache/sling/query/selector/parser/SelectorSegment.java b/src/main/java/org/apache/sling/query/selector/parser/SelectorSegment.java
index 0c649c8..87dca67 100644
--- a/src/main/java/org/apache/sling/query/selector/parser/SelectorSegment.java
+++ b/src/main/java/org/apache/sling/query/selector/parser/SelectorSegment.java
@@ -39,8 +39,8 @@ public class SelectorSegment {
 	public SelectorSegment(ParserContext context, boolean firstSegment) {
 		this.type = context.getType();
 		this.name = context.getName();
-		this.attributes = new ArrayList<Attribute>(context.getAttributes());
-		this.modifiers = new ArrayList<Modifier>(context.getModifiers());
+		this.attributes = new ArrayList<>(context.getAttributes());
+		this.modifiers = new ArrayList<>(context.getModifiers());
 		if (firstSegment) {
 			hierarchyOperator = 0;
 		} else {
diff --git a/src/test/java/org/apache/sling/query/FilterTest.java b/src/test/java/org/apache/sling/query/FilterTest.java
index 5002e0f..acf9664 100644
--- a/src/test/java/org/apache/sling/query/FilterTest.java
+++ b/src/test/java/org/apache/sling/query/FilterTest.java
@@ -24,10 +24,11 @@ import static org.apache.sling.query.TestUtils.assertEmptyIterator;
 import static org.apache.sling.query.TestUtils.assertResourceSetEquals;
 
 import org.apache.sling.api.resource.Resource;
-import org.apache.sling.query.api.Predicate;
 import org.apache.sling.query.api.SearchStrategy;
 import org.junit.Test;
 
+import java.util.function.Predicate;
+
 public class FilterTest {
 
 	private Resource tree = TestUtils.getTree();
@@ -35,23 +36,13 @@ public class FilterTest {
 	@Test
 	public void testFilter() {
 		SlingQuery query = $(tree).searchStrategy(SearchStrategy.DFS).find()
-				.filter(new Predicate<Resource>() {
-					@Override
-					public boolean accepts(Resource resource) {
-						return "configParsys".equals(resource.getName());
-					}
-				});
+				.filter(resource -> "configParsys".equals(resource.getName()));
 		assertResourceSetEquals(query.iterator(), "configParsys");
 	}
 
 	@Test
 	public void testFilterOnEmptyCollection() {
-		SlingQuery query = $(tree).children("cq:Undefined").filter(new Predicate<Resource>() {
-			@Override
-			public boolean accepts(Resource resource) {
-				return true;
-			}
-		});
+		SlingQuery query = $(tree).children("cq:Undefined").filter(resource -> true);
 		assertEmptyIterator(query.iterator());
 	}
 }

-- 
To stop receiving notification emails like this one, please contact
"commits@sling.apache.org" <co...@sling.apache.org>.