Explorar o código

new: CQuery#mapOptional

Mariusz Czarnowski %!s(int64=4) %!d(string=hai) anos
pai
achega
10ca2f1f82

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

@@ -94,7 +94,9 @@ public interface CQuery<T> extends Iterable<T> {
     <R> CQuery<R> filter(IClass<R> p);
 
     <R> CQuery<R> map(Function<? super T,? extends R> f);
-    
+
+    <R> CQuery<R> mapOptional(Function<? super T, Optional<? extends R>> f);
+
     <R> CQuery<R> mapEach(EachFunction<? super T,? extends R> f);
     
     <R> CQuery<R> unfold(Function<? super T, CQuery<R>> f);
@@ -107,6 +109,8 @@ public interface CQuery<T> extends Iterable<T> {
 
     CQuery<T> mapEachIf(EachPredicate<? super T> p, EachFunction<? super T,? extends T> f);
 
+    CQuery<T> mapOptionalIf(Predicate<? super T> p, Function<? super T, Optional<? extends T>> f);
+
     CQuery<T> unfoldIf(Predicate<? super T> p, Function<? super T, CQuery<T>> f);
 
     CQuery<T> flatIf(Predicate<? super T> p, Function<? super T, Iterable<T>> f);

+ 13 - 1
assira.core/src/main/java/net/ranides/assira/collection/query/CQueryAbstract.java

@@ -145,7 +145,12 @@ public abstract class CQueryAbstract<T> implements CQuery<T> {
     public final <R> CQuery<R> map(Function<? super T, ? extends R> f) {
         return new CQIterable<>(() -> IteratorUtils.map(iterator(), f));
     }
-    
+
+    @Override
+    public <R> CQuery<R> mapOptional(Function<? super T, Optional<? extends R>> f) {
+        return map(f).filter(Optional::isPresent).map(Optional::get);
+    }
+
     @Override
     public final <R> CQuery<R> mapEach(EachFunction<? super T, ? extends R> f) {
         return new CQIterable<>(() -> IteratorUtils.map(iterator(), f));
@@ -161,6 +166,13 @@ public abstract class CQueryAbstract<T> implements CQuery<T> {
         return mapEach((i, v) -> !p.test(i, v) ? v : f.apply(i,v));
     }
 
+    @Override
+    public CQuery<T> mapOptionalIf(Predicate<? super T> p, Function<? super T, Optional<? extends T>> f) {
+        return map(v -> !p.test(v) ? Optional.of(v) : f.apply(v))
+                .filter(Optional::isPresent)
+                .map(Optional::get);
+    }
+
     @Override
     public final <R> CQuery<R> unfold(Function<? super T, CQuery<R>> f) {
         return new CQIterable<>(() -> IteratorUtils.flat(IteratorUtils.map(iterator(), (v) -> f.apply(v).iterator())));