From a86732cf1aa8a53c1d832156ab90c40db407767b Mon Sep 17 00:00:00 2001 From: Jochen Berger Date: Wed, 24 Sep 2014 14:46:49 +0200 Subject: [PATCH] more tiny performance improvements --- .../main/java/com/jayway/jsonpath/Filter.java | 44 +++++++++++-------- 1 file changed, 25 insertions(+), 19 deletions(-) diff --git a/json-path/src/main/java/com/jayway/jsonpath/Filter.java b/json-path/src/main/java/com/jayway/jsonpath/Filter.java index 630e7c25..c4d93c91 100644 --- a/json-path/src/main/java/com/jayway/jsonpath/Filter.java +++ b/json-path/src/main/java/com/jayway/jsonpath/Filter.java @@ -1,26 +1,27 @@ package com.jayway.jsonpath; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.List; -import static java.util.Arrays.asList; - /** * */ public class Filter implements Predicate { - protected List criteriaList = new ArrayList(); + protected final List criteriaList; private Filter() { + criteriaList = Collections.emptyList(); } private Filter(Predicate criteria) { - this.criteriaList.add(criteria); + criteriaList = Collections.singletonList(criteria); } private Filter(List criteriaList) { - this.criteriaList = criteriaList; + this.criteriaList = new ArrayList(criteriaList); } @@ -63,22 +64,27 @@ public class Filter implements Predicate { } public Filter or(final Predicate other){ - return new Filter(){ - @Override - public boolean apply(PredicateContext ctx) { - boolean a = Filter.this.apply(ctx); - return a || other.apply(ctx); - } - }; + return new OrFilter(this, other); } public Filter and(final Predicate other){ - return new Filter(){ - @Override - public boolean apply(PredicateContext ctx) { - boolean a = Filter.this.apply(ctx); - return a && other.apply(ctx); - } - }; + return filter(Arrays.asList(this, other)); + } + + private static final class OrFilter extends Filter { + + private final Predicate left; + private final Predicate right; + + private OrFilter(Predicate left, Predicate right) { + this.left = left; + this.right = right; + } + + @Override + public boolean apply(PredicateContext ctx) { + boolean a = left.apply(ctx); + return a || right.apply(ctx); + } } }