Explorar el Código

new: CQuery#flat

Mariusz Sieroń hace 6 años
padre
commit
6d72e00710

+ 17 - 1
assira/src/main/java/net/ranides/assira/collection/FlatCollection.java

@@ -8,6 +8,7 @@ package net.ranides.assira.collection;
 
 import java.io.Serializable;
 import java.util.*;
+import java.util.stream.Stream;
 
 /**
  * Dynamic view with elements from merged collections.
@@ -29,6 +30,10 @@ public class FlatCollection<T> extends AbstractCollection<T> implements Serializ
         joinAll(Arrays.asList(values));
     }
 
+    public FlatCollection(Stream<Collection<T>> values) {
+        joinAll(values);
+    }
+
     public FlatCollection(Collection<Collection<T>> values) {
         joinAll(values);
     }
@@ -49,7 +54,7 @@ public class FlatCollection<T> extends AbstractCollection<T> implements Serializ
     }
 
     /***
-     * Inserts into view specified collections.
+     * Inserts specified collections into view.
      * Note: It stores containers, not actual elements from them.
      * @param list
      * @return 
@@ -59,6 +64,17 @@ public class FlatCollection<T> extends AbstractCollection<T> implements Serializ
         return this;
     }
 
+    /***
+     * Inserts specified collections into view.
+     * Note: It stores containers, not actual elements from them.
+     * @param stream
+     * @return
+     */
+    public final FlatCollection<T> joinAll(Stream<Collection<T>> stream) {
+        stream.forEachOrdered(content::add);
+        return this;
+    }
+
     @Override
     public int size() {
         int size = 0;

+ 3 - 1
assira/src/main/java/net/ranides/assira/collection/query/CQuery.java

@@ -61,7 +61,9 @@ public interface CQuery<T> extends Iterable<T> {
     <R> CQuery<R> map(EachFunction<? super T,? extends R> f);
     
     <R> CQuery<R> unfold(Function<? super T, CQuery<R>> f);
-    
+
+    <R> CQuery<R> flat(Function<? super T, Iterable<R>> f);
+
     <R> CQuery<R> split(Function<? super T, R[]> f);
     
     T fold(T identity, BinaryOperator<T> accumulator);

+ 7 - 0
assira/src/main/java/net/ranides/assira/collection/query/CQueryAbstract.java

@@ -13,6 +13,8 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
 
+import net.ranides.assira.collection.CollectionUtils;
+import net.ranides.assira.collection.FlatCollection;
 import net.ranides.assira.collection.HashFunction;
 import net.ranides.assira.collection.arrays.ArrayUtils;
 import net.ranides.assira.collection.iterators.IteratorUtils;
@@ -121,6 +123,11 @@ public abstract class CQueryAbstract<T> implements CQuery<T> {
         return new CQIterable<>(() -> IteratorUtils.flat(IteratorUtils.map(iterator(), (v) -> f.apply(v).iterator())));
     }
 
+    @Override
+    public final <R> CQuery<R> flat(Function<? super T, Iterable<R>> f) {
+        return new CQIterable<>(() -> IteratorUtils.flat(IteratorUtils.map(iterator(), (v) -> f.apply(v).iterator())));
+    }
+
     @Override
     public <R> CQuery<R> split(Function<? super T, R[]> f) {
         return unfold(v -> CQueryBuilder.fromArray(f.apply(v)) );