diff --git a/README.md b/README.md index 84180e6..55a4322 100644 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ An extension of the java.util.List interface which include some of the C# LINQ u List classes are extended as well. (ArrayList -> BetterArrayList) -Current version v1.2 +Current version v1.3 Before BetterLists : ```Java @@ -30,7 +30,7 @@ NOTE : Please note that, unlike C# LINQ, these functions are not optimized at lo ## Download -* [betterlists-1.2.jar](../../raw/master/download/betterlists-1.2.jar) +* [betterlists-1.3.jar](../../raw/master/download/betterlists-1.3.jar) ## Maven @@ -49,7 +49,7 @@ You can use this project as a maven dependency with this : klemek betterlists - 1.2 + 1.3 ``` @@ -71,6 +71,7 @@ You can use this project as a maven dependency with this : | [orderBy / orderByDescending](#orderby-orderbydescending) | Sorts the elements of a sequence in ascending order by using a specified comparator. (You can user orderByDescending to change the order) | | [reverse](#reverse) | Inverts the order of the elements in the sequence. | | [select](#select) | Projects each element of a sequence into a new form. | +| [selectMany](#selectmany) | Projects each element of a sequence into a new list and flattens the resulting sequences into one sequence. | | [skip / skipWhile](#skip-skipwhile) | Bypasses elements in the sequence as long as a specified condition is true and then returns the remaining elements. | | [sum](#sum) | Computes the sum of the sequence of Double values that are obtained by invoking a transform function on each element of the input sequence. | | [take / takeWhile](#take-takewhile) | Returns a specified number of contiguous elements from the start of the sequence. | @@ -177,6 +178,15 @@ BetterArrayList contacts = BetterArrayList.fromList(someFunction()); BetterList contactsMails = contacts.select(c -> c.getEmail()); ``` +### selectMany +Projects each element of a sequence into a new list and flattens the resulting sequences into one sequence. +```Java +BetterArrayList contacts = BetterArrayList.fromList(someFunction()); + +BetterList contactsMails = contacts.select(c -> c.getEmail().split(";")); +``` + + ### skip / skipWhile Bypasses elements in the sequence as long as a specified condition is true and then returns the remaining elements. ```Java diff --git a/download/betterlists-1.3.jar b/download/betterlists-1.3.jar new file mode 100644 index 0000000..f891b8c Binary files /dev/null and b/download/betterlists-1.3.jar differ diff --git a/src/fr/klemek/betterlists/BetterArrayList.java b/src/fr/klemek/betterlists/BetterArrayList.java index a525e13..b8f4789 100644 --- a/src/fr/klemek/betterlists/BetterArrayList.java +++ b/src/fr/klemek/betterlists/BetterArrayList.java @@ -7,25 +7,23 @@ import java.util.Collection; /** * An extension of the java.util.ArrayList class which include some of the C# * LINQ useful functions. - * - * @author Klemek * + * @author Klemek * @see java.util.ArrayList */ public class BetterArrayList extends ArrayList implements BetterList { - private static final long serialVersionUID = 4772544470059394618L; + private static final long serialVersionUID = 4772544470059394618L; - /** - * Constructs a list containing the elements of the specified collection, in the - * order they are returned by the collection's iterator. - * - * @param c - * - the collection whose elements are to be placed into this list - */ - public static BetterArrayList fromList(Collection c) { - return new BetterArrayList<>(c); - } + /** + * Constructs a list containing the elements of the specified collection, in the + * order they are returned by the collection's iterator. + * + * @param c - the collection whose elements are to be placed into this list + */ + public static BetterArrayList fromList(Collection c) { + return new BetterArrayList<>(c); + } /** * Constructs a list containing the elements given in argument. @@ -36,29 +34,27 @@ public class BetterArrayList extends ArrayList implements BetterList { return new BetterArrayList<>(a); } - /** - * Constructs an empty list with an initial capacity of ten. - */ - public BetterArrayList() { - super(); - } + /** + * Constructs an empty list with an initial capacity of ten. + */ + public BetterArrayList() { + super(); + } - /** - * Constructs a list containing the elements of the specified collection, in the - * order they are returned by the collection's iterator. - * - * @param c - * - the collection whose elements are to be placed into this list - */ - public BetterArrayList(Collection c) { - super(c); - } + /** + * Constructs a list containing the elements of the specified collection, in the + * order they are returned by the collection's iterator. + * + * @param c - the collection whose elements are to be placed into this list + */ + public BetterArrayList(Collection c) { + super(c); + } - /** + /** * Constructs a list containing the elements given in argument. * - * @param a - * - the elements to be placed into this list + * @param a - the elements to be placed into this list */ public BetterArrayList(T... a) { super(Arrays.asList(a)); @@ -73,29 +69,26 @@ public class BetterArrayList extends ArrayList implements BetterList { super(initialCapacity); } - /** - * Returns a view of the portion of this list between the specified fromIndex, - * inclusive, and toIndex, exclusive. (If fromIndex and toIndex are equal, the - * returned list is empty.) The returned list is backed by this list, so - * non-structural changes in the returned list are reflected in this list, and - * vice-versa. The returned list supports all of the optional list operations - * supported by this list. This method eliminates the need for explicit range - * operations (of the sort that commonly exist for arrays). Any operation that - * expects a list can be used as a range operation by passing a subList view - * instead of a whole list. (see List.subList) - * - * @param fromIndex - * - low endpoint (inclusive) of the subList - * @param toIndex - * - high endpoint (exclusive) of the subList - * @return a view of the specified range within this list - * @throws IndexOutOfBoundsException - * for an illegal endpoint index value (fromIndex < 0 || toIndex > - * size || fromIndex > toIndex) - * @see java.util.List - */ - @Override - public BetterArrayList subList(int fromIndex, int toIndex) { + /** + * Returns a view of the portion of this list between the specified fromIndex, + * inclusive, and toIndex, exclusive. (If fromIndex and toIndex are equal, the + * returned list is empty.) The returned list is backed by this list, so + * non-structural changes in the returned list are reflected in this list, and + * vice-versa. The returned list supports all of the optional list operations + * supported by this list. This method eliminates the need for explicit range + * operations (of the sort that commonly exist for arrays). Any operation that + * expects a list can be used as a range operation by passing a subList view + * instead of a whole list. (see List.subList) + * + * @param fromIndex - low endpoint (inclusive) of the subList + * @param toIndex - high endpoint (exclusive) of the subList + * @return a view of the specified range within this list + * @throws IndexOutOfBoundsException for an illegal endpoint index value (fromIndex < 0 || toIndex > + * size || fromIndex > toIndex) + * @see java.util.List + */ + @Override + public BetterArrayList subList(int fromIndex, int toIndex) { return (BetterArrayList) super.subList(fromIndex, toIndex); } } diff --git a/src/fr/klemek/betterlists/BetterCopyOnWriteArrayList.java b/src/fr/klemek/betterlists/BetterCopyOnWriteArrayList.java new file mode 100644 index 0000000..fdb7e5d --- /dev/null +++ b/src/fr/klemek/betterlists/BetterCopyOnWriteArrayList.java @@ -0,0 +1,86 @@ +package fr.klemek.betterlists; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.concurrent.CopyOnWriteArrayList; + +/** + * An extension of the java.concurrent.CopyOnWriteArrayList class which include some of the C# + * LINQ useful functions. + * + * @author Klemek + * @see ArrayList + */ +public class BetterCopyOnWriteArrayList extends CopyOnWriteArrayList implements BetterList { + + private static final long serialVersionUID = -1148672915754560195L; + + /** + * Constructs a list containing the elements of the specified collection, in the + * order they are returned by the collection's iterator. + * + * @param c - the collection whose elements are to be placed into this list + */ + public static BetterCopyOnWriteArrayList fromList(Collection c) { + return new BetterCopyOnWriteArrayList<>(c); + } + + /** + * Constructs a list containing the elements given in argument. + * + * @param a - the elements to be placed into this list + */ + public static BetterCopyOnWriteArrayList asList(T... a) { + return new BetterCopyOnWriteArrayList<>(a); + } + + /** + * Constructs an empty list with an initial capacity of ten. + */ + public BetterCopyOnWriteArrayList() { + super(); + } + + /** + * Constructs a list containing the elements of the specified collection, in the + * order they are returned by the collection's iterator. + * + * @param c - the collection whose elements are to be placed into this list + */ + public BetterCopyOnWriteArrayList(Collection c) { + super(c); + } + + /** + * Constructs a list containing the elements given in argument. + * + * @param a - the elements to be placed into this list + */ + public BetterCopyOnWriteArrayList(T... a) { + super(Arrays.asList(a)); + } + + /** + * Returns a view of the portion of this list between the specified fromIndex, + * inclusive, and toIndex, exclusive. (If fromIndex and toIndex are equal, the + * returned list is empty.) The returned list is backed by this list, so + * non-structural changes in the returned list are reflected in this list, and + * vice-versa. The returned list supports all of the optional list operations + * supported by this list. This method eliminates the need for explicit range + * operations (of the sort that commonly exist for arrays). Any operation that + * expects a list can be used as a range operation by passing a subList view + * instead of a whole list. (see List.subList) + * + * @param fromIndex - low endpoint (inclusive) of the subList + * @param toIndex - high endpoint (exclusive) of the subList + * @return a view of the specified range within this list + * @throws IndexOutOfBoundsException for an illegal endpoint index value (fromIndex < 0 || toIndex > + * size || fromIndex > toIndex) + * @see java.util.List + */ + @Override + public BetterCopyOnWriteArrayList subList(int fromIndex, int toIndex) { + return (BetterCopyOnWriteArrayList) super.subList(fromIndex, toIndex); + } +} diff --git a/src/fr/klemek/betterlists/BetterLinkedList.java b/src/fr/klemek/betterlists/BetterLinkedList.java index c572800..cc3c6be 100644 --- a/src/fr/klemek/betterlists/BetterLinkedList.java +++ b/src/fr/klemek/betterlists/BetterLinkedList.java @@ -7,25 +7,23 @@ import java.util.LinkedList; /** * An extension of the java.util.LinkedList class which include some of the C# * LINQ useful functions. - * - * @author Klemek * + * @author Klemek * @see java.util.LinkedList */ public class BetterLinkedList extends LinkedList implements BetterList { - private static final long serialVersionUID = 4837198308074701770L; + private static final long serialVersionUID = 4837198308074701770L; - /** - * Constructs a list containing the elements of the specified collection, in the - * order they are returned by the collection's iterator. - * - * @param c - * - the collection whose elements are to be placed into this list - */ - public static BetterLinkedList fromList(Collection c) { - return new BetterLinkedList<>(c); - } + /** + * Constructs a list containing the elements of the specified collection, in the + * order they are returned by the collection's iterator. + * + * @param c - the collection whose elements are to be placed into this list + */ + public static BetterLinkedList fromList(Collection c) { + return new BetterLinkedList<>(c); + } /** * Constructs a list containing the elements given in argument. @@ -36,29 +34,27 @@ public class BetterLinkedList extends LinkedList implements BetterList return new BetterLinkedList<>(a); } - /** - * Constructs an empty list. - */ - public BetterLinkedList() { - super(); - } + /** + * Constructs an empty list. + */ + public BetterLinkedList() { + super(); + } - /** - * Constructs a list containing the elements of the specified collection, in the - * order they are returned by the collection's iterator. - * - * @param c - * - the collection whose elements are to be placed into this list - */ - public BetterLinkedList(Collection c) { - super(c); - } + /** + * Constructs a list containing the elements of the specified collection, in the + * order they are returned by the collection's iterator. + * + * @param c - the collection whose elements are to be placed into this list + */ + public BetterLinkedList(Collection c) { + super(c); + } - /** + /** * Constructs a list containing the elements given in argument. * - * @param a - * - the elements to be placed into this list + * @param a - the elements to be placed into this list */ public BetterLinkedList(T... a) { super(Arrays.asList(a)); diff --git a/src/fr/klemek/betterlists/BetterList.java b/src/fr/klemek/betterlists/BetterList.java index 9ed74c7..6940787 100644 --- a/src/fr/klemek/betterlists/BetterList.java +++ b/src/fr/klemek/betterlists/BetterList.java @@ -1,456 +1,441 @@ package fr.klemek.betterlists; -import java.util.Collections; -import java.util.List; -import java.util.NoSuchElementException; +import java.util.*; import java.util.function.Function; /** * An extension of the java.util.List interface which include some of the C# * LINQ useful functions. - * - * @author Klemek * + * @author Klemek * @see java.util.List */ public interface BetterList extends List { - /** - * Determines whether all elements of the sequence satisfy a condition. - * - * @param predicate - * - A function to test each element for a condition. - * @return true if every element of the source sequence passes the test in the - * specified predicate, or if the sequence is empty; otherwise, false. - */ - public default boolean all(Function predicate) { - for (T element : this) - if (!predicate.apply(element)) - return false; - return true; - } + /** + * Determines whether all elements of the sequence satisfy a condition. + * + * @param predicate - A function to test each element for a condition. + * @return true if every element of the source sequence passes the test in the + * specified predicate, or if the sequence is empty; otherwise, false. + */ + default boolean all(Function predicate) { + for (T element : this) + if (!predicate.apply(element)) + return false; + return true; + } - /** - * Determines whether any element of the sequence satisfies a condition. - * - * @param predicate - * - A function to test each element for a condition. - * @return true if any elements in the source sequence pass the test in the - * specified predicate; otherwise, false. - */ + /** + * Determines whether any element of the sequence satisfies a condition. + * + * @param predicate - A function to test each element for a condition. + * @return true if any elements in the source sequence pass the test in the + * specified predicate; otherwise, false. + */ default boolean any(Function predicate) { - for (T element : this) - if (predicate.apply(element)) - return true; - return false; - } + for (T element : this) + if (predicate.apply(element)) + return true; + return false; + } - /** - * Returns the number of elements in the sequence. - * - * @return The number of elements in the input sequence. - */ + /** + * Returns the number of elements in the sequence. + * + * @return The number of elements in the input sequence. + */ default int count() { - return count(e -> true); - } + return count(e -> true); + } - /** - * Returns a number that represents how many elements in the specified sequence - * satisfy a condition. - * - * @param predicate - * - A function to test each element for a condition. - * @return A number that represents how many elements in the sequence satisfy - * the condition in the predicate function. - */ + /** + * Returns a number that represents how many elements in the specified sequence + * satisfy a condition. + * + * @param predicate - A function to test each element for a condition. + * @return A number that represents how many elements in the sequence satisfy + * the condition in the predicate function. + */ default int count(Function predicate) { - int out = 0; - for (T element : this) - if (predicate.apply(element)) - out++; - return out; - } + int out = 0; + for (T element : this) + if (predicate.apply(element)) + out++; + return out; + } - /** - * Produces the set exclusion of two sequences. - * - * @param other - * - Another List whose distinct elements form the second set for the - * exclusion. - * @return A List that contains the elements from the first sequence not present - * in the other. - */ + /** + * Produces the set exclusion of two sequences. + * + * @param other - Another List whose distinct elements form the second set for the + * exclusion. + * @return A List that contains the elements from the first sequence not present + * in the other. + */ default BetterList exclusion(List other) { - BetterList out = new BetterArrayList<>(); - for (T element : this) - if (!other.contains(element)) - out.add(element); - return out; - } + BetterList out = new BetterArrayList<>(); + for (T element : this) + if (!other.contains(element)) + out.add(element); + return out; + } - /** - * Returns the first element in the sequence. - * - * @throws NoSuchElementException - * If the sequence is empty. - * @return The first element in the sequence. - */ + /** + * Returns the first element in the sequence. + * + * @return The first element in the sequence. + * @throws NoSuchElementException If the sequence is empty. + */ default T first() { - return first(e -> true); - } + return first(e -> true); + } - /** - * Returns the first element in the sequence that satisfies a specified - * condition. - * - * @param predicate - * - A function to test each element for a condition. - * @throws NoSuchElementException - * No element satisfies the condition in predicate or the sequence - * is empty. - * @return The first element in the sequence that passes the test in the - * specified predicate function. - */ + /** + * Returns the first element in the sequence that satisfies a specified + * condition. + * + * @param predicate - A function to test each element for a condition. + * @return The first element in the sequence that passes the test in the + * specified predicate function. + * @throws NoSuchElementException No element satisfies the condition in predicate or the sequence + * is empty. + */ default T first(Function predicate) { - for (T element : this) - if (predicate.apply(element)) - return element; - throw new NoSuchElementException(); - } + for (T element : this) + if (predicate.apply(element)) + return element; + throw new NoSuchElementException(); + } - /** - * Returns the first element of the sequence that satisfies a condition or the - * default value if no such element is found. - * - * @param predicate - * - A function to test each element for a condition. - * @param defaultValue - * - A default value to be returned if no element passes the test - * @return defaultValue if the sequence is empty or if no element passes the - * test specified by predicate; otherwise, the first element in the - * sequence that passes the test specified by predicate. - */ + /** + * Returns the first element of the sequence that satisfies a condition or the + * default value if no such element is found. + * + * @param predicate - A function to test each element for a condition. + * @param defaultValue - A default value to be returned if no element passes the test + * @return defaultValue if the sequence is empty or if no element passes the + * test specified by predicate; otherwise, the first element in the + * sequence that passes the test specified by predicate. + */ default T firstOrDefault(Function predicate, T defaultValue) { - for (T element : this) - if (predicate.apply(element)) - return element; - return defaultValue; - } + for (T element : this) + if (predicate.apply(element)) + return element; + return defaultValue; + } - /** - * Returns the first element of the sequence or a default value if the sequence - * is empty. - * - * @param defaultValue - * - A default value to be returned if the sequence is empty - * @return defaultValue if the sequence is empty otherwise, the first element in - * the sequence. - */ + /** + * Returns the first element of the sequence or a default value if the sequence + * is empty. + * + * @param defaultValue - A default value to be returned if the sequence is empty + * @return defaultValue if the sequence is empty otherwise, the first element in + * the sequence. + */ default T firstOrDefault(T defaultValue) { - return firstOrDefault(e -> true, defaultValue); - } + return firstOrDefault(e -> true, defaultValue); + } - /** - * Returns the last element of the sequence. - * - * @throws NoSuchElementException - * If the sequence is empty. - * @return the last element of the sequence. - */ + /** + * Returns the last element of the sequence. + * + * @return the last element of the sequence. + * @throws NoSuchElementException If the sequence is empty. + */ default T last() { - return last(e -> true); - } + return last(e -> true); + } - /** - * Returns the last element of the sequence that satisfies a specified - * condition. - * - * @param predicate - * - A function to test each element for a condition. - * @throws NoSuchElementException - * No element satisfies the condition in predicate or the sequence - * is empty. - * @return the last element of the sequence that satisfies a specified - * condition. - */ + /** + * Returns the last element of the sequence that satisfies a specified + * condition. + * + * @param predicate - A function to test each element for a condition. + * @return the last element of the sequence that satisfies a specified + * condition. + * @throws NoSuchElementException No element satisfies the condition in predicate or the sequence + * is empty. + */ default T last(Function predicate) { - T value = null; - for (T element : this) - if (predicate.apply(element)) - value = element; - if (value == null) - throw new NoSuchElementException(); - return value; - } + T value = null; + for (T element : this) + if (predicate.apply(element)) + value = element; + if (value == null) + throw new NoSuchElementException(); + return value; + } - /** - * Returns the last element of the sequence that satisfies a condition or the - * default value if no such element is found. - * - * @param predicate - * - A function to test each element for a condition. - * @param defaultValue - * - A default value to be returned if no element passes the test - * @return defaultValue if the sequence is empty or if no element passes the - * test specified by predicate; otherwise, the last element in the - * sequence that passes the test specified by predicate. - */ + /** + * Returns the last element of the sequence that satisfies a condition or the + * default value if no such element is found. + * + * @param predicate - A function to test each element for a condition. + * @param defaultValue - A default value to be returned if no element passes the test + * @return defaultValue if the sequence is empty or if no element passes the + * test specified by predicate; otherwise, the last element in the + * sequence that passes the test specified by predicate. + */ default T lastOrDefault(Function predicate, T defaultValue) { - T value = null; - for (T element : this) - if (predicate.apply(element)) - value = element; - return value == null ? defaultValue : value; - } + T value = null; + for (T element : this) + if (predicate.apply(element)) + value = element; + return value == null ? defaultValue : value; + } - /** - * Returns the last element of the sequence or a default value if the sequence - * is empty. - * - * @param defaultValue - * - A default value to be returned if the sequence is empty - * @return defaultValue if the sequence is empty otherwise, the last element in - * the sequence. - */ + /** + * Returns the last element of the sequence or a default value if the sequence + * is empty. + * + * @param defaultValue - A default value to be returned if the sequence is empty + * @return defaultValue if the sequence is empty otherwise, the last element in + * the sequence. + */ default T lastOrDefault(T defaultValue) { - return lastOrDefault(e -> true, defaultValue); - } + return lastOrDefault(e -> true, defaultValue); + } - /** - * Invokes a transform function on each element of the sequence and returns the - * maximum nullable Double value. - * - * @param selector - * - A transform function to apply to each element. - * @return The value of type Double that corresponds to the maximum value in the - * sequence or null if the sequence is empty. - */ + /** + * Invokes a transform function on each element of the sequence and returns the + * maximum nullable Double value. + * + * @param selector - A transform function to apply to each element. + * @return The value of type Double that corresponds to the maximum value in the + * sequence or null if the sequence is empty. + */ default Double max(Function selector) { - Double max = null; - for (T element : this) - if (max == null || selector.apply(element) > max) - max = selector.apply(element); - return max; - } + Double max = null; + for (T element : this) + if (max == null || selector.apply(element) > max) + max = selector.apply(element); + return max; + } - /** - * Computes the mean of the sequence of Double values that are obtained by - * invoking a transform function on each element of the input sequence. - * - * @param selector - * - A transform function to apply to each element. - * @return The mean of the projected values. Null if the sequence contains no - * elements. - */ + /** + * Computes the mean of the sequence of Double values that are obtained by + * invoking a transform function on each element of the input sequence. + * + * @param selector - A transform function to apply to each element. + * @return The mean of the projected values. Null if the sequence contains no + * elements. + */ default Double mean(Function selector) { - int count = this.count(); - if (count == 0) - return null; - return this.sum(selector) / this.count(); - } + int count = this.count(); + if (count == 0) + return null; + return this.sum(selector) / this.count(); + } - /** - * Invokes a transform function on each element of the sequence and returns the - * minimum nullable Double value. - * - * @param selector - * - A transform function to apply to each element. - * @return The value of type Double that corresponds to the minimum value in the - * sequence or null if the sequence is empty. - */ + /** + * Invokes a transform function on each element of the sequence and returns the + * minimum nullable Double value. + * + * @param selector - A transform function to apply to each element. + * @return The value of type Double that corresponds to the minimum value in the + * sequence or null if the sequence is empty. + */ default Double min(Function selector) { - Double min = null; - for (T element : this) - if (min == null || selector.apply(element) < min) - min = selector.apply(element); - return min; - } - - /** - * Sorts the elements of a sequence in ascending order by using a specified comparer. - * @param selector - * - A transform function to apply to each element. - * @return a List whose elements are sorted according to a key. - */ + Double min = null; + for (T element : this) + if (min == null || selector.apply(element) < min) + min = selector.apply(element); + return min; + } + + /** + * Sorts the elements of a sequence in ascending order by using a specified comparer. + * + * @param selector - A transform function to apply to each element. + * @return a List whose elements are sorted according to a key. + */ default > BetterList orderBy(Function selector) { - BetterList out = new BetterArrayList<>(); - out.addAll(this); - Collections.sort(out, (o1,o2) -> selector.apply(o1).compareTo(selector.apply(o2))); - return out; - } + BetterList out = new BetterArrayList<>(); + out.addAll(this); + Collections.sort(out, (o1, o2) -> selector.apply(o1).compareTo(selector.apply(o2))); + return out; + } - /** - * Sorts the elements of a sequence in descending order by using a specified comparer. - * @param selector - * - A transform function to apply to each element. - * @return a List whose elements are sorted according to a key. - */ + /** + * Sorts the elements of a sequence in descending order by using a specified comparer. + * + * @param selector - A transform function to apply to each element. + * @return a List whose elements are sorted according to a key. + */ default > BetterList orderByDescending(Function selector) { - BetterList out = new BetterArrayList<>(); - out.addAll(this); - Collections.sort(out, (o1,o2) -> selector.apply(o2).compareTo(selector.apply(o1))); - return out; - } - - /** - * Inverts the order of the elements in the sequence. - * - * @return A sequence whose elements correspond to those of the sequence in - * reverse order. - */ + BetterList out = new BetterArrayList<>(); + out.addAll(this); + Collections.sort(out, (o1, o2) -> selector.apply(o2).compareTo(selector.apply(o1))); + return out; + } + + /** + * Inverts the order of the elements in the sequence. + * + * @return A sequence whose elements correspond to those of the sequence in + * reverse order. + */ default BetterList reverse() { - BetterList out = new BetterArrayList<>(this.size()); - for (T element : this) - out.add(0, element); - return out; - } - - /** - * Projects each element of a sequence into a new form. - * - * @param - * The type of the projected values - * @param selector - * - A transform function to apply to each element. - * @return A List whose elements are the result of invoking the transform - * function on each element of the sequence. - */ + BetterList out = new BetterArrayList<>(this.size()); + for (T element : this) + out.add(0, element); + return out; + } + + /** + * Projects each element of a sequence into a new form. + * + * @param The type of the projected values + * @param selector - A transform function to apply to each element. + * @return A List whose elements are the result of invoking the transform + * function on each element of the sequence. + */ default BetterList select(Function selector) { - BetterList out = new BetterArrayList<>(); - for (T element : this) - out.add(selector.apply(element)); - return out; - } + BetterList out = new BetterArrayList<>(); + for (T element : this) + out.add(selector.apply(element)); + return out; + } - /** - * Bypasses a specified number of elements in the sequence and then returns the - * remaining elements. - * - * @param count - * - The number of elements to skip before returning the remaining - * elements. - * @return a List that contains the elements that occur after the specified - * index in the sequence. - */ + /** + * Projects each element of a sequence into a new list and flattens the + * resulting sequences into one sequence. + * + * @param The type of the projected values lists + * @param selector - A transform function to apply to each element. + * @return A List whose elements are the result of invoking the one-to-many + * transform function on each element of the input sequence. + */ + default BetterList selectMany(Function selector) { + BetterList out = new BetterArrayList<>(); + for (T element : this) + out.addAll(Arrays.asList(selector.apply(element))); + return out; + } + + /** + * Bypasses a specified number of elements in the sequence and then returns the + * remaining elements. + * + * @param count - The number of elements to skip before returning the remaining + * elements. + * @return a List that contains the elements that occur after the specified + * index in the sequence. + */ default BetterList skip(int count) { - BetterList out = new BetterArrayList<>(); - int n = 0; - for (T element : this) { - if (n >= count) - out.add(element); - n++; - } - return out; - } + BetterList out = new BetterArrayList<>(); + int n = 0; + for (T element : this) { + if (n >= count) + out.add(element); + n++; + } + return out; + } - /** - * Bypasses elements in the sequence as long as a specified condition is true - * and then returns the remaining elements. - * - * @param predicate - * - A function to test each element for a condition. - * @return a List that contains the elements from the sequence starting at the - * first element in the linear series that does not pass the test - * specified by predicate. - */ + /** + * Bypasses elements in the sequence as long as a specified condition is true + * and then returns the remaining elements. + * + * @param predicate - A function to test each element for a condition. + * @return a List that contains the elements from the sequence starting at the + * first element in the linear series that does not pass the test + * specified by predicate. + */ default BetterList skipWhile(Function predicate) { - BetterList out = new BetterArrayList<>(); - boolean match = true; - for (T element : this) - if (!match || !predicate.apply(element)) { - match = false; - out.add(element); - } - return out; - } + BetterList out = new BetterArrayList<>(); + boolean match = true; + for (T element : this) + if (!match || !predicate.apply(element)) { + match = false; + out.add(element); + } + return out; + } - /** - * Computes the sum of the sequence of Double values that are obtained by - * invoking a transform function on each element of the input sequence. - * - * @param selector - * - A transform function to apply to each element. - * @return The sum of the projected values. Zero if the sequence contains no - * elements. - */ + /** + * Computes the sum of the sequence of Double values that are obtained by + * invoking a transform function on each element of the input sequence. + * + * @param selector - A transform function to apply to each element. + * @return The sum of the projected values. Zero if the sequence contains no + * elements. + */ default Double sum(Function selector) { - double sum = 0d; - for (T element : this) - sum += selector.apply(element); - return sum; - } + double sum = 0d; + for (T element : this) + sum += selector.apply(element); + return sum; + } - /** - * Returns a specified number of contiguous elements from the start of the - * sequence. - * - * @param count - * - The number of elements to return. - * @return a List that contains the specified number of elements from the start - * of the input sequence. - */ + /** + * Returns a specified number of contiguous elements from the start of the + * sequence. + * + * @param count - The number of elements to return. + * @return a List that contains the specified number of elements from the start + * of the input sequence. + */ default BetterList take(int count) { - BetterList out = new BetterArrayList<>(count); - int n = 0; - for (T element : this) { - if (n < count) - out.add(element); - else - break; - n++; - } - return out; - } + BetterList out = new BetterArrayList<>(count); + int n = 0; + for (T element : this) { + if (n < count) + out.add(element); + else + break; + n++; + } + return out; + } - /** - * Returns elements from the sequence as long as a specified condition is true. - * - * @param predicate - * - A function to test each element for a condition. - * @return a List that contains the elements from the sequence that occur before - * the element at which the test no longer passes. - */ + /** + * Returns elements from the sequence as long as a specified condition is true. + * + * @param predicate - A function to test each element for a condition. + * @return a List that contains the elements from the sequence that occur before + * the element at which the test no longer passes. + */ default BetterList takeWhile(Function predicate) { - BetterList out = new BetterArrayList<>(); - for (T element : this) - if (predicate.apply(element)) - out.add(element); - else - break; - return out; - } - - /** - * Produces the set union of two sequences. - * - * @param other - * - Another List whose distinct elements form the second set for the - * union. - * @return A List that contains the elements from both sequences, excluding - * duplicates. - */ - default BetterList union(List other) { - BetterList out = new BetterArrayList<>(); - for (T element : this) - if (other.contains(element)) - out.add(element); - return out; - } + BetterList out = new BetterArrayList<>(); + for (T element : this) + if (predicate.apply(element)) + out.add(element); + else + break; + return out; + } - /** - * Filters a sequence of values based on a predicate. - * - * @param predicate - * - A function to test each element for a condition. - * @return a List that contains elements from the sequence that satisfy the - * condition. - */ + /** + * Produces the set union of two sequences. + * + * @param other - Another List whose distinct elements form the second set for the + * union. + * @return A List that contains the elements from both sequences, excluding + * duplicates. + */ + default BetterList union(List other) { + BetterList out = new BetterArrayList<>(); + for (T element : this) + if (other.contains(element)) + out.add(element); + return out; + } + + /** + * Filters a sequence of values based on a predicate. + * + * @param predicate - A function to test each element for a condition. + * @return a List that contains elements from the sequence that satisfy the + * condition. + */ default BetterList where(Function predicate) { - BetterList out = new BetterArrayList<>(); - for (T element : this) - if (predicate.apply(element)) - out.add(element); - return out; - } + BetterList out = new BetterArrayList<>(); + for (T element : this) + if (predicate.apply(element)) + out.add(element); + return out; + } } diff --git a/src/fr/klemek/betterlists/BetterStack.java b/src/fr/klemek/betterlists/BetterStack.java index 82f32e1..9650aa2 100644 --- a/src/fr/klemek/betterlists/BetterStack.java +++ b/src/fr/klemek/betterlists/BetterStack.java @@ -5,46 +5,42 @@ import java.util.Stack; /** * An extension of the java.util.Stack class which include some of the C# LINQ * useful functions. - * - * @author Klemek * + * @author Klemek * @see java.util.Stack */ public class BetterStack extends Stack implements BetterList { - private static final long serialVersionUID = 5642889973315247461L; + private static final long serialVersionUID = 5642889973315247461L; - /** - * Creates an empty Stack. - */ - public BetterStack() { - super(); - } + /** + * Creates an empty Stack. + */ + public BetterStack() { + super(); + } - /** - * Returns a view of the portion of this list between the specified fromIndex, - * inclusive, and toIndex, exclusive. (If fromIndex and toIndex are equal, the - * returned list is empty.) The returned list is backed by this list, so - * non-structural changes in the returned list are reflected in this list, and - * vice-versa. The returned list supports all of the optional list operations - * supported by this list. This method eliminates the need for explicit range - * operations (of the sort that commonly exist for arrays). Any operation that - * expects a list can be used as a range operation by passing a subList view - * instead of a whole list. (see List.subList) - * - * @param fromIndex - * - low endpoint (inclusive) of the subList - * @param toIndex - * - high endpoint (exclusive) of the subList - * @return a view of the specified range within this list - * @throws IndexOutOfBoundsException - * for an illegal endpoint index value (fromIndex < 0 || toIndex > - * size || fromIndex > toIndex) - * @see java.util.List - */ - @Override - public BetterStack subList(int fromIndex, int toIndex) { - return (BetterStack) super.subList(fromIndex, toIndex); - } + /** + * Returns a view of the portion of this list between the specified fromIndex, + * inclusive, and toIndex, exclusive. (If fromIndex and toIndex are equal, the + * returned list is empty.) The returned list is backed by this list, so + * non-structural changes in the returned list are reflected in this list, and + * vice-versa. The returned list supports all of the optional list operations + * supported by this list. This method eliminates the need for explicit range + * operations (of the sort that commonly exist for arrays). Any operation that + * expects a list can be used as a range operation by passing a subList view + * instead of a whole list. (see List.subList) + * + * @param fromIndex - low endpoint (inclusive) of the subList + * @param toIndex - high endpoint (exclusive) of the subList + * @return a view of the specified range within this list + * @throws IndexOutOfBoundsException for an illegal endpoint index value (fromIndex < 0 || toIndex > + * size || fromIndex > toIndex) + * @see java.util.List + */ + @Override + public BetterStack subList(int fromIndex, int toIndex) { + return (BetterStack) super.subList(fromIndex, toIndex); + } } diff --git a/src/fr/klemek/betterlists/BetterVector.java b/src/fr/klemek/betterlists/BetterVector.java index 71f372e..5a32d9d 100644 --- a/src/fr/klemek/betterlists/BetterVector.java +++ b/src/fr/klemek/betterlists/BetterVector.java @@ -7,111 +7,103 @@ import java.util.Vector; /** * An extension of the java.util.Vector class which include some of the C# LINQ * useful functions. - * - * @author Klemek * + * @author Klemek * @see java.util.Vector */ public class BetterVector extends Vector implements BetterList { - private static final long serialVersionUID = -704157461726911759L; + private static final long serialVersionUID = -704157461726911759L; - /** - * Constructs a vector containing the elements of the specified collection, in - * the order they are returned by the collection's iterator. - * - * @param c - * - the collection whose elements are to be placed into this vector - */ - public static BetterVector fromList(Collection c) { - return new BetterVector<>(c); - } + /** + * Constructs a vector containing the elements of the specified collection, in + * the order they are returned by the collection's iterator. + * + * @param c - the collection whose elements are to be placed into this vector + */ + public static BetterVector fromList(Collection c) { + return new BetterVector<>(c); + } - /** - * Constructs a vector containing the elements given in argument. - * - * @param a - the elements to be placed into this vector - */ - public static BetterVector asVector(T... a) { - return new BetterVector<>(a); - } + /** + * Constructs a vector containing the elements given in argument. + * + * @param a - the elements to be placed into this vector + */ + public static BetterVector asVector(T... a) { + return new BetterVector<>(a); + } - /** - * Constructs an empty vector so that its internal data array has size 10 and - * its standard capacity increment is zero. - */ - public BetterVector() { - super(); - } + /** + * Constructs an empty vector so that its internal data array has size 10 and + * its standard capacity increment is zero. + */ + public BetterVector() { + super(); + } - /** - * Constructs a vector containing the elements of the specified collection, in - * the order they are returned by the collection's iterator. - * - * @param c - * - the collection whose elements are to be placed into this vector - */ - public BetterVector(Collection c) { - super(c); - } + /** + * Constructs a vector containing the elements of the specified collection, in + * the order they are returned by the collection's iterator. + * + * @param c - the collection whose elements are to be placed into this vector + */ + public BetterVector(Collection c) { + super(c); + } - /** - * Constructs a vector containing the elements given in argument. - * - * @param a - the elements to be placed into this list - */ - public BetterVector(T... a) { - super(Arrays.asList(a)); - } + /** + * Constructs a vector containing the elements given in argument. + * + * @param a - the elements to be placed into this list + */ + public BetterVector(T... a) { + super(Arrays.asList(a)); + } - /** - * Constructs an empty vector with the specified initial capacity and with its - * capacity increment equal to zero. - * - * @param initialCapacity - the initial capacity of the vector - */ - public BetterVector(int initialCapacity) { - super(initialCapacity); - } + /** + * Constructs an empty vector with the specified initial capacity and with its + * capacity increment equal to zero. + * + * @param initialCapacity - the initial capacity of the vector + */ + public BetterVector(int initialCapacity) { + super(initialCapacity); + } - /** - * Constructs an empty vector with the specified initial capacity and capacity - * increment. - * - * @param initialCapacity - * - the initial capacity of the vector - * @param capacityIncrement - * - the amount by which the capacity is increased when the vector - * overflows - */ - public BetterVector(int initialCapacity, int capacityIncrement) { - super(initialCapacity, capacityIncrement); - } + /** + * Constructs an empty vector with the specified initial capacity and capacity + * increment. + * + * @param initialCapacity - the initial capacity of the vector + * @param capacityIncrement - the amount by which the capacity is increased when the vector + * overflows + */ + public BetterVector(int initialCapacity, int capacityIncrement) { + super(initialCapacity, capacityIncrement); + } - /** - * Returns a view of the portion of this list between the specified fromIndex, - * inclusive, and toIndex, exclusive. (If fromIndex and toIndex are equal, the - * returned list is empty.) The returned list is backed by this list, so - * non-structural changes in the returned list are reflected in this list, and - * vice-versa. The returned list supports all of the optional list operations - * supported by this list. This method eliminates the need for explicit range - * operations (of the sort that commonly exist for arrays). Any operation that - * expects a list can be used as a range operation by passing a subList view - * instead of a whole list. (see List.subList) - * - * @param fromIndex - * - low endpoint (inclusive) of the subList - * @param toIndex - * - high endpoint (exclusive) of the subList - * @return a view of the specified range within this list - * @throws IndexOutOfBoundsException - * for an illegal endpoint index value (fromIndex < 0 || toIndex > - * size || fromIndex > toIndex) - * @see java.util.List - */ - @Override - public BetterVector subList(int fromIndex, int toIndex) { - return (BetterVector) super.subList(fromIndex, toIndex); - } + /** + * Returns a view of the portion of this list between the specified fromIndex, + * inclusive, and toIndex, exclusive. (If fromIndex and toIndex are equal, the + * returned list is empty.) The returned list is backed by this list, so + * non-structural changes in the returned list are reflected in this list, and + * vice-versa. The returned list supports all of the optional list operations + * supported by this list. This method eliminates the need for explicit range + * operations (of the sort that commonly exist for arrays). Any operation that + * expects a list can be used as a range operation by passing a subList view + * instead of a whole list. (see List.subList) + * + * @param fromIndex - low endpoint (inclusive) of the subList + * @param toIndex - high endpoint (exclusive) of the subList + * @return a view of the specified range within this list + * @throws IndexOutOfBoundsException for an illegal endpoint index value (fromIndex < 0 || toIndex > + * size || fromIndex > toIndex) + * @see java.util.List + */ + @Override + public BetterVector subList(int fromIndex, int toIndex) { + return (BetterVector) super.subList(fromIndex, toIndex); + } } diff --git a/test/fr/klemek/betterlists/test/BetterListsTests.java b/test/fr/klemek/betterlists/test/BetterListsTests.java index 581519c..e9b517d 100644 --- a/test/fr/klemek/betterlists/test/BetterListsTests.java +++ b/test/fr/klemek/betterlists/test/BetterListsTests.java @@ -1,332 +1,346 @@ package fr.klemek.betterlists.test; -import java.util.ArrayList; -import java.util.NoSuchElementException; - import fr.klemek.betterlists.BetterArrayList; import org.junit.Assert; import org.junit.Test; +import java.util.ArrayList; +import java.util.NoSuchElementException; + public class BetterListsTests { - protected class Dummy { + protected class Dummy { final double d; final String s; - - public Dummy(double d, String s) { - this.d = d; - this.s = s; - } - @Override - public boolean equals(Object obj) { - if (this == obj) - return true; - if (obj == null) - return false; - if (getClass() != obj.getClass()) - return false; - Dummy other = (Dummy) obj; - if (!getOuterType().equals(other.getOuterType())) - return false; - if (Double.doubleToLongBits(d) != Double.doubleToLongBits(other.d)) - return false; + public Dummy(double d, String s) { + this.d = d; + this.s = s; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Dummy other = (Dummy) obj; + if (!getOuterType().equals(other.getOuterType())) + return false; + if (Double.doubleToLongBits(d) != Double.doubleToLongBits(other.d)) + return false; if (s == null && other.s != null) { - return false; + return false; } else return s.equals(other.s); - } + } - private BetterListsTests getOuterType() { - return BetterListsTests.this; - } + private BetterListsTests getOuterType() { + return BetterListsTests.this; + } - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + getOuterType().hashCode(); - long temp; - temp = Double.doubleToLongBits(d); - result = prime * result + (int) (temp ^ (temp >>> 32)); - result = prime * result + ((s == null) ? 0 : s.hashCode()); - return result; - } - } + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + getOuterType().hashCode(); + long temp; + temp = Double.doubleToLongBits(d); + result = prime * result + (int) (temp ^ (temp >>> 32)); + result = prime * result + ((s == null) ? 0 : s.hashCode()); + return result; + } + } - @Test - public void testAll() { + @Test + public void testAll() { ArrayList al = new ArrayList<>(); - al.add(new Dummy(1d,"hello")); - al.add(new Dummy(2d,"test")); - al.add(new Dummy(2d,"hello")); - - BetterArrayList bal = BetterArrayList.fromList(al); - - Assert.assertTrue(bal.all(du -> du.d > 0)); - Assert.assertFalse(bal.all(du -> du.d > 1)); - } + al.add(new Dummy(1d, "hello")); + al.add(new Dummy(2d, "test")); + al.add(new Dummy(2d, "hello")); - @Test - public void testAny() { + BetterArrayList bal = BetterArrayList.fromList(al); + + Assert.assertTrue(bal.all(du -> du.d > 0)); + Assert.assertFalse(bal.all(du -> du.d > 1)); + } + + @Test + public void testAny() { BetterArrayList bal = new BetterArrayList<>(); - bal.add(new Dummy(1d,"hello")); - bal.add(new Dummy(2d,"test")); - bal.add(new Dummy(2d,"hello")); - - Assert.assertTrue(bal.any(du -> du.s.startsWith("t"))); - Assert.assertFalse(bal.any(du -> du.s.startsWith("b"))); - } + bal.add(new Dummy(1d, "hello")); + bal.add(new Dummy(2d, "test")); + bal.add(new Dummy(2d, "hello")); - @Test - public void testCount() { + Assert.assertTrue(bal.any(du -> du.s.startsWith("t"))); + Assert.assertFalse(bal.any(du -> du.s.startsWith("b"))); + } + + @Test + public void testCount() { BetterArrayList bal = new BetterArrayList<>(); - bal.add(new Dummy(1d,"hello")); - bal.add(new Dummy(2d,"test")); - bal.add(new Dummy(2d,"hello")); - - Assert.assertEquals(3, bal.count()); - Assert.assertEquals(2, bal.count(du -> du.s.length() > 4)); - } + bal.add(new Dummy(1d, "hello")); + bal.add(new Dummy(2d, "test")); + bal.add(new Dummy(2d, "hello")); - @Test - public void testExclude() { + Assert.assertEquals(3, bal.count()); + Assert.assertEquals(2, bal.count(du -> du.s.length() > 4)); + } + + @Test + public void testExclude() { BetterArrayList bal1 = new BetterArrayList<>(); - bal1.add(new Dummy(1d,"hello")); - bal1.add(new Dummy(2d,"test")); - bal1.add(new Dummy(3d,"hello")); - bal1.add(new Dummy(4d,"test")); + bal1.add(new Dummy(1d, "hello")); + bal1.add(new Dummy(2d, "test")); + bal1.add(new Dummy(3d, "hello")); + bal1.add(new Dummy(4d, "test")); BetterArrayList bal2 = new BetterArrayList<>(); - bal2.add(new Dummy(2d,"test")); - bal2.add(new Dummy(3d,"hello")); - bal2.add(new Dummy(5d,"test")); - - BetterArrayList bal3 = (BetterArrayList) bal1.exclusion(bal2); - Assert.assertEquals(2, bal3.size()); - Assert.assertEquals(bal1.get(0), bal3.get(0)); - Assert.assertEquals(bal1.get(3), bal3.get(1)); - } + bal2.add(new Dummy(2d, "test")); + bal2.add(new Dummy(3d, "hello")); + bal2.add(new Dummy(5d, "test")); - @Test - public void testFirst() { + BetterArrayList bal3 = (BetterArrayList) bal1.exclusion(bal2); + Assert.assertEquals(2, bal3.size()); + Assert.assertEquals(bal1.get(0), bal3.get(0)); + Assert.assertEquals(bal1.get(3), bal3.get(1)); + } + + @Test + public void testFirst() { BetterArrayList bal = new BetterArrayList<>(); - bal.add(new Dummy(1d,"hello")); - bal.add(new Dummy(2d,"test")); - bal.add(new Dummy(2d,"hello")); + bal.add(new Dummy(1d, "hello")); + bal.add(new Dummy(2d, "test")); + bal.add(new Dummy(2d, "hello")); - Assert.assertEquals(bal.get(0), bal.first(du -> du.s.startsWith("h"))); + Assert.assertEquals(bal.get(0), bal.first(du -> du.s.startsWith("h"))); - try { - bal.first(du -> du.s.startsWith("d")); - Assert.fail("no error"); - } catch (NoSuchElementException e) { - } + try { + bal.first(du -> du.s.startsWith("d")); + Assert.fail("no error"); + } catch (NoSuchElementException e) { + } - Assert.assertEquals(bal.get(0), bal.firstOrDefault(du -> du.s.startsWith("h"), new Dummy(3d,"default"))); - - Assert.assertEquals(new Dummy(3d,"default"), bal.firstOrDefault(du -> du.s.startsWith("d"), new Dummy(3d,"default"))); - } + Assert.assertEquals(bal.get(0), bal.firstOrDefault(du -> du.s.startsWith("h"), new Dummy(3d, "default"))); - @Test - public void testLast() { + Assert.assertEquals(new Dummy(3d, "default"), bal.firstOrDefault(du -> du.s.startsWith("d"), new Dummy(3d, "default"))); + } + + @Test + public void testLast() { BetterArrayList bal = new BetterArrayList<>(); - bal.add(new Dummy(1d,"hello")); - bal.add(new Dummy(2d,"test")); - bal.add(new Dummy(2d,"hello")); + bal.add(new Dummy(1d, "hello")); + bal.add(new Dummy(2d, "test")); + bal.add(new Dummy(2d, "hello")); - Assert.assertEquals(bal.get(2), bal.last(du -> du.s.startsWith("h"))); - - try { - bal.last(du -> du.s.startsWith("d")); - Assert.fail("no error"); - } catch (NoSuchElementException e) { - } + Assert.assertEquals(bal.get(2), bal.last(du -> du.s.startsWith("h"))); - Assert.assertEquals(bal.get(2), bal.lastOrDefault(du -> du.s.startsWith("h"), new Dummy(3d,"default"))); - - Assert.assertEquals(new Dummy(3d,"default"), bal.lastOrDefault(du -> du.s.startsWith("d"), new Dummy(3d,"default"))); - } + try { + bal.last(du -> du.s.startsWith("d")); + Assert.fail("no error"); + } catch (NoSuchElementException e) { + } - @Test - public void testMax() { + Assert.assertEquals(bal.get(2), bal.lastOrDefault(du -> du.s.startsWith("h"), new Dummy(3d, "default"))); + + Assert.assertEquals(new Dummy(3d, "default"), bal.lastOrDefault(du -> du.s.startsWith("d"), new Dummy(3d, "default"))); + } + + @Test + public void testMax() { BetterArrayList bal = new BetterArrayList<>(); - bal.add(new Dummy(1d,"hello")); - bal.add(new Dummy(2d,"test")); - bal.add(new Dummy(3d,"hello2")); - - Assert.assertEquals(6d, bal.max(du -> (double)du.s.length()), 0.001d); - } + bal.add(new Dummy(1d, "hello")); + bal.add(new Dummy(2d, "test")); + bal.add(new Dummy(3d, "hello2")); - @Test - public void testMean() { + Assert.assertEquals(6d, bal.max(du -> (double) du.s.length()), 0.001d); + } + + @Test + public void testMean() { BetterArrayList bal = new BetterArrayList<>(); - bal.add(new Dummy(1d,"hello")); - bal.add(new Dummy(2d,"test")); - bal.add(new Dummy(3d,"hello2")); - - Assert.assertEquals(5d, bal.mean(du -> (double)du.s.length()), 0.001d); - } + bal.add(new Dummy(1d, "hello")); + bal.add(new Dummy(2d, "test")); + bal.add(new Dummy(3d, "hello2")); - @Test - public void testMin() { + Assert.assertEquals(5d, bal.mean(du -> (double) du.s.length()), 0.001d); + } + + @Test + public void testMin() { BetterArrayList bal = new BetterArrayList<>(); - bal.add(new Dummy(1d,"hello")); - bal.add(new Dummy(2d,"test")); - bal.add(new Dummy(3d,"hello2")); - - Assert.assertEquals(4d, bal.min(du -> (double)du.s.length()), 0.001d); - } + bal.add(new Dummy(1d, "hello")); + bal.add(new Dummy(2d, "test")); + bal.add(new Dummy(3d, "hello2")); - @Test - public void testOrderBy() { + Assert.assertEquals(4d, bal.min(du -> (double) du.s.length()), 0.001d); + } + + @Test + public void testOrderBy() { BetterArrayList bal1 = new BetterArrayList<>(); - bal1.add(new Dummy(1d,"hello1")); - bal1.add(new Dummy(2d,"hello2")); - bal1.add(new Dummy(3d,"hello0")); - bal1.add(new Dummy(4d,"test")); - bal1.add(new Dummy(5d,"hello4")); - - BetterArrayList bal2 = (BetterArrayList) bal1.orderBy(c -> c.s); - Assert.assertNotEquals(bal1, bal2); - Assert.assertEquals(bal1.get(2), bal2.get(0)); - Assert.assertEquals(bal1.get(0), bal2.get(1)); - Assert.assertEquals(bal1.get(1), bal2.get(2)); - Assert.assertEquals(bal1.get(4), bal2.get(3)); - Assert.assertEquals(bal1.get(3), bal2.get(4)); - } + bal1.add(new Dummy(1d, "hello1")); + bal1.add(new Dummy(2d, "hello2")); + bal1.add(new Dummy(3d, "hello0")); + bal1.add(new Dummy(4d, "test")); + bal1.add(new Dummy(5d, "hello4")); - @Test - public void testOrderByDescending() { - BetterArrayList bal1 = new BetterArrayList<>(); - bal1.add(new Dummy(1d,"hello1")); - bal1.add(new Dummy(2d,"hello2")); - bal1.add(new Dummy(3d,"hello0")); - bal1.add(new Dummy(4d,"test")); - bal1.add(new Dummy(5d,"hello4")); - - BetterArrayList bal2 = (BetterArrayList) bal1.orderByDescending(c -> c.d); - Assert.assertNotEquals(bal1, bal2); - for(int i = 0; i < 5; i++) - Assert.assertEquals(bal1.get(4-i), bal2.get(i)); - } + BetterArrayList bal2 = (BetterArrayList) bal1.orderBy(c -> c.s); + Assert.assertNotEquals(bal1, bal2); + Assert.assertEquals(bal1.get(2), bal2.get(0)); + Assert.assertEquals(bal1.get(0), bal2.get(1)); + Assert.assertEquals(bal1.get(1), bal2.get(2)); + Assert.assertEquals(bal1.get(4), bal2.get(3)); + Assert.assertEquals(bal1.get(3), bal2.get(4)); + } - @Test - public void testReverse() { + @Test + public void testOrderByDescending() { BetterArrayList bal1 = new BetterArrayList<>(); - bal1.add(new Dummy(1d,"hello")); - bal1.add(new Dummy(2d,"hello")); - bal1.add(new Dummy(3d,"hello")); - bal1.add(new Dummy(4d,"test")); - bal1.add(new Dummy(5d,"hello")); - - BetterArrayList bal2 = (BetterArrayList) bal1.reverse(); - Assert.assertEquals(5, bal2.size()); - for(int i = 0; i < 5; i++) - Assert.assertEquals(bal1.get(i), bal2.get(4-i)); - } + bal1.add(new Dummy(1d, "hello1")); + bal1.add(new Dummy(2d, "hello2")); + bal1.add(new Dummy(3d, "hello0")); + bal1.add(new Dummy(4d, "test")); + bal1.add(new Dummy(5d, "hello4")); - @Test - public void testSelect() { + BetterArrayList bal2 = (BetterArrayList) bal1.orderByDescending(c -> c.d); + Assert.assertNotEquals(bal1, bal2); + for (int i = 0; i < 5; i++) + Assert.assertEquals(bal1.get(4 - i), bal2.get(i)); + } + + @Test + public void testReverse() { BetterArrayList bal1 = new BetterArrayList<>(); - bal1.add(new Dummy(1d,"hello")); - bal1.add(new Dummy(2d,"hello")); - bal1.add(new Dummy(3d,"hello")); - bal1.add(new Dummy(4d,"test")); - bal1.add(new Dummy(5d,"hello")); + bal1.add(new Dummy(1d, "hello")); + bal1.add(new Dummy(2d, "hello")); + bal1.add(new Dummy(3d, "hello")); + bal1.add(new Dummy(4d, "test")); + bal1.add(new Dummy(5d, "hello")); + + BetterArrayList bal2 = (BetterArrayList) bal1.reverse(); + Assert.assertEquals(5, bal2.size()); + for (int i = 0; i < 5; i++) + Assert.assertEquals(bal1.get(i), bal2.get(4 - i)); + } + + @Test + public void testSelect() { + BetterArrayList bal1 = new BetterArrayList<>(); + bal1.add(new Dummy(1d, "hello")); + bal1.add(new Dummy(2d, "hello")); + bal1.add(new Dummy(3d, "hello")); + bal1.add(new Dummy(4d, "test")); + bal1.add(new Dummy(5d, "hello")); BetterArrayList bal2 = (BetterArrayList) bal1.select(du -> du.d); - Assert.assertEquals(5, bal2.size()); - for(int i = 0; i < 5; i++) - Assert.assertEquals(bal1.get(i).d, bal2.get(i), 0.0001); - } + Assert.assertEquals(5, bal2.size()); + for (int i = 0; i < 5; i++) + Assert.assertEquals(bal1.get(i).d, bal2.get(i), 0.0001); + } - @Test - public void testSkip() { + @Test + public void testSelectMany() { BetterArrayList bal1 = new BetterArrayList<>(); - bal1.add(new Dummy(1d,"hello")); - bal1.add(new Dummy(2d,"hello")); - bal1.add(new Dummy(3d,"hello")); - bal1.add(new Dummy(4d,"test")); - bal1.add(new Dummy(5d,"hello")); - - Assert.assertEquals(bal1, bal1.skip(0)); - Assert.assertEquals(0, bal1.skip(10).size()); - - BetterArrayList bal2 = (BetterArrayList) bal1.skip(2); - Assert.assertEquals(3, bal2.size()); - for(int i = 0; i < 3; i++) - Assert.assertEquals(bal1.get(i+2), bal2.get(i)); - - BetterArrayList bal3 = (BetterArrayList) bal1.skipWhile(du -> du.s.startsWith("h")); - Assert.assertEquals(2, bal3.size()); - for(int i = 0; i < 2; i++) - Assert.assertEquals(bal1.get(i+3), bal3.get(i)); - } - - @Test - public void testSum() { + bal1.add(new Dummy(1d, "hel;lo")); + bal1.add(new Dummy(2d, "hel;lo")); + + BetterArrayList bal2 = (BetterArrayList) bal1.selectMany(du -> du.s.split(";")); + Assert.assertEquals(4, bal2.size()); + Assert.assertEquals("hel", bal2.get(0)); + Assert.assertEquals("lo", bal2.get(1)); + Assert.assertEquals("hel", bal2.get(2)); + Assert.assertEquals("lo", bal2.get(3)); + } + + @Test + public void testSkip() { + BetterArrayList bal1 = new BetterArrayList<>(); + bal1.add(new Dummy(1d, "hello")); + bal1.add(new Dummy(2d, "hello")); + bal1.add(new Dummy(3d, "hello")); + bal1.add(new Dummy(4d, "test")); + bal1.add(new Dummy(5d, "hello")); + + Assert.assertEquals(bal1, bal1.skip(0)); + Assert.assertEquals(0, bal1.skip(10).size()); + + BetterArrayList bal2 = (BetterArrayList) bal1.skip(2); + Assert.assertEquals(3, bal2.size()); + for (int i = 0; i < 3; i++) + Assert.assertEquals(bal1.get(i + 2), bal2.get(i)); + + BetterArrayList bal3 = (BetterArrayList) bal1.skipWhile(du -> du.s.startsWith("h")); + Assert.assertEquals(2, bal3.size()); + for (int i = 0; i < 2; i++) + Assert.assertEquals(bal1.get(i + 3), bal3.get(i)); + } + + @Test + public void testSum() { BetterArrayList bal = new BetterArrayList<>(); - bal.add(new Dummy(1d,"hello")); - bal.add(new Dummy(2d,"test")); - bal.add(new Dummy(3d,"hello2")); - - Assert.assertEquals(6d, bal.sum(du -> du.d), 0.001d); - } - - @Test - public void testTake() { + bal.add(new Dummy(1d, "hello")); + bal.add(new Dummy(2d, "test")); + bal.add(new Dummy(3d, "hello2")); + + Assert.assertEquals(6d, bal.sum(du -> du.d), 0.001d); + } + + @Test + public void testTake() { BetterArrayList bal1 = new BetterArrayList<>(); - bal1.add(new Dummy(1d,"hello")); - bal1.add(new Dummy(2d,"hello")); - bal1.add(new Dummy(3d,"hello")); - bal1.add(new Dummy(4d,"test")); - bal1.add(new Dummy(5d,"hello")); - - Assert.assertEquals(bal1, bal1.take(10)); - - Assert.assertEquals(0, bal1.take(0).size()); - - BetterArrayList bal2 = (BetterArrayList) bal1.take(2); - Assert.assertEquals(2, bal2.size()); - for(int i = 0; i < 2; i++) - Assert.assertEquals(bal1.get(i), bal2.get(i)); - - BetterArrayList bal3 = (BetterArrayList) bal1.takeWhile(du -> du.s.startsWith("h")); - Assert.assertEquals(3, bal3.size()); - for(int i = 0; i < 3; i++) - Assert.assertEquals(bal1.get(i), bal3.get(i)); - } - - @Test - public void testUnion() { + bal1.add(new Dummy(1d, "hello")); + bal1.add(new Dummy(2d, "hello")); + bal1.add(new Dummy(3d, "hello")); + bal1.add(new Dummy(4d, "test")); + bal1.add(new Dummy(5d, "hello")); + + Assert.assertEquals(bal1, bal1.take(10)); + + Assert.assertEquals(0, bal1.take(0).size()); + + BetterArrayList bal2 = (BetterArrayList) bal1.take(2); + Assert.assertEquals(2, bal2.size()); + for (int i = 0; i < 2; i++) + Assert.assertEquals(bal1.get(i), bal2.get(i)); + + BetterArrayList bal3 = (BetterArrayList) bal1.takeWhile(du -> du.s.startsWith("h")); + Assert.assertEquals(3, bal3.size()); + for (int i = 0; i < 3; i++) + Assert.assertEquals(bal1.get(i), bal3.get(i)); + } + + @Test + public void testUnion() { BetterArrayList bal1 = new BetterArrayList<>(); - bal1.add(new Dummy(1d,"hello")); - bal1.add(new Dummy(2d,"test")); - bal1.add(new Dummy(3d,"hello")); - bal1.add(new Dummy(4d,"test")); + bal1.add(new Dummy(1d, "hello")); + bal1.add(new Dummy(2d, "test")); + bal1.add(new Dummy(3d, "hello")); + bal1.add(new Dummy(4d, "test")); BetterArrayList bal2 = new BetterArrayList<>(); - bal2.add(new Dummy(2d,"test")); - bal2.add(new Dummy(3d,"hello")); - bal2.add(new Dummy(5d,"test")); - - BetterArrayList bal3 = (BetterArrayList) bal1.union(bal2); - Assert.assertEquals(2, bal3.size()); - Assert.assertEquals(bal1.get(1), bal3.get(0)); - Assert.assertEquals(bal1.get(2), bal3.get(1)); - } + bal2.add(new Dummy(2d, "test")); + bal2.add(new Dummy(3d, "hello")); + bal2.add(new Dummy(5d, "test")); - @Test - public void testWhere() { + BetterArrayList bal3 = (BetterArrayList) bal1.union(bal2); + Assert.assertEquals(2, bal3.size()); + Assert.assertEquals(bal1.get(1), bal3.get(0)); + Assert.assertEquals(bal1.get(2), bal3.get(1)); + } + + @Test + public void testWhere() { BetterArrayList bal = new BetterArrayList<>(); - bal.add(new Dummy(1d,"hello")); - bal.add(new Dummy(2d,"test")); - bal.add(new Dummy(3d,"hello")); + bal.add(new Dummy(1d, "hello")); + bal.add(new Dummy(2d, "test")); + bal.add(new Dummy(3d, "hello")); - BetterArrayList bal2 = (BetterArrayList) bal.where(du -> du.s.startsWith("h")); + BetterArrayList bal2 = (BetterArrayList) bal.where(du -> du.s.startsWith("h")); - Assert.assertEquals(2, bal2.size()); - Assert.assertEquals(new Dummy(1d,"hello"), bal2.get(0)); - Assert.assertEquals(new Dummy(3d,"hello"), bal2.get(1)); - } + Assert.assertEquals(2, bal2.size()); + Assert.assertEquals(new Dummy(1d, "hello"), bal2.get(0)); + Assert.assertEquals(new Dummy(3d, "hello"), bal2.get(1)); + } }