From ee47ae021aed75b1c467e31f75729224c02f943b Mon Sep 17 00:00:00 2001 From: Hannes Pernpeintner Date: Thu, 3 Sep 2015 18:49:52 +0200 Subject: [PATCH] #184 Fluent interface pattern, added cached initialization to anonymous iterator for lazy fluentiterable, small documentation changes --- .../lazy/DecoratingIterator.java | 2 +- .../lazy/LazyFluentIterable.java | 28 ++++++++++++------- .../simple/SimpleFluentIterable.java | 1 + 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/fluentinterface/src/main/java/com/iluwatar/fluentinterface/fluentiterable/lazy/DecoratingIterator.java b/fluentinterface/src/main/java/com/iluwatar/fluentinterface/fluentiterable/lazy/DecoratingIterator.java index 35c4cc0ae..3c1230bce 100644 --- a/fluentinterface/src/main/java/com/iluwatar/fluentinterface/fluentiterable/lazy/DecoratingIterator.java +++ b/fluentinterface/src/main/java/com/iluwatar/fluentinterface/fluentiterable/lazy/DecoratingIterator.java @@ -4,7 +4,7 @@ import java.util.Iterator; /** * This class is used to realize LazyFluentIterables. It decorates - * a given iterator. + * a given iterator. Does not support consecutive hasNext() calls. * @param */ public abstract class DecoratingIterator implements Iterator { diff --git a/fluentinterface/src/main/java/com/iluwatar/fluentinterface/fluentiterable/lazy/LazyFluentIterable.java b/fluentinterface/src/main/java/com/iluwatar/fluentinterface/fluentiterable/lazy/LazyFluentIterable.java index 27bca1bf6..998bbd659 100644 --- a/fluentinterface/src/main/java/com/iluwatar/fluentinterface/fluentiterable/lazy/LazyFluentIterable.java +++ b/fluentinterface/src/main/java/com/iluwatar/fluentinterface/fluentiterable/lazy/LazyFluentIterable.java @@ -126,19 +126,14 @@ public class LazyFluentIterable implements FluentIterable { @Override public Iterator iterator() { return new DecoratingIterator(iterable.iterator()) { - int currentIndex = 0; + public int stopIndex; + public int totalElementsCount; + private List list; + private int currentIndex = 0; @Override public TYPE computeNext() { - List list = new ArrayList<>(); - - Iterator newIterator = iterable.iterator(); - while(newIterator.hasNext()) { - list.add(newIterator.next()); - } - - int totalElementsCount = list.size(); - int stopIndex = totalElementsCount - count; + initialize(); TYPE candidate = null; while(currentIndex < stopIndex && fromIterator.hasNext()) { @@ -150,6 +145,19 @@ public class LazyFluentIterable implements FluentIterable { } return candidate; } + + private void initialize() { + if(list == null) { + list = new ArrayList<>(); + Iterator newIterator = iterable.iterator(); + while(newIterator.hasNext()) { + list.add(newIterator.next()); + } + + totalElementsCount = list.size(); + stopIndex = totalElementsCount - count; + } + } }; } }; diff --git a/fluentinterface/src/main/java/com/iluwatar/fluentinterface/fluentiterable/simple/SimpleFluentIterable.java b/fluentinterface/src/main/java/com/iluwatar/fluentinterface/fluentiterable/simple/SimpleFluentIterable.java index a4bf77218..0736387e5 100644 --- a/fluentinterface/src/main/java/com/iluwatar/fluentinterface/fluentiterable/simple/SimpleFluentIterable.java +++ b/fluentinterface/src/main/java/com/iluwatar/fluentinterface/fluentiterable/simple/SimpleFluentIterable.java @@ -10,6 +10,7 @@ import java.util.function.Predicate; /** * This is a simple implementation of the FluentIterable interface. It evaluates * all chained operations eagerly. + * This implementation would be costly to be utilized in real applications. * @param the type of the objects the iteration is about */ public class SimpleFluentIterable implements FluentIterable {