You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2011/01/05 23:59:13 UTC
svn commit: r1055679 - in /tapestry/tapestry5/trunk/tapestry-func/src:
main/java/org/apache/tapestry5/func/ test/java/org/apache/tapestry5/func/
Author: hlship
Date: Wed Jan 5 22:59:13 2011
New Revision: 1055679
URL: http://svn.apache.org/viewvc?rev=1055679&view=rev
Log:
TAP5-1390: Add support for converting a Map to a ZippedFlow, and a ZippedFlow to a Map
Modified:
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/F.java
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/ZippedFlow.java
tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/ZippedFlowImpl.java
tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/ZippedFlowTests.java
Modified: tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/F.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/F.java?rev=1055679&r1=1055678&r2=1055679&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/F.java (original)
+++ tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/F.java Wed Jan 5 22:59:13 2011
@@ -16,6 +16,8 @@ package org.apache.tapestry5.func;
import java.util.Collection;
import java.util.Iterator;
+import java.util.Map;
+import java.util.Map.Entry;
/**
* Functional operations on collections with generics support. The core interface is {@link Flow} to
@@ -325,6 +327,35 @@ public class F
}
/**
+ * Creates a ZippedFlow from the provided map; the order of the tuples in the ZippedFlow is defined
+ * by the iteration order of the map entries.
+ *
+ * @param <A>
+ * type of key and first tuple value
+ * @param <B>
+ * type of value and second tuple value
+ * @param map
+ * source of tuples
+ * @return zipped flow created from map
+ * @since 5.3.0
+ */
+ public static <A, B> ZippedFlow<A, B> zippedFlow(Map<A, B> map)
+ {
+ assert map != null;
+
+ Flow<Tuple<A, B>> tuples = F.flow(map.entrySet()).map(new Mapper<Map.Entry<A, B>, Tuple<A, B>>()
+ {
+ @Override
+ public Tuple<A, B> map(Entry<A, B> element)
+ {
+ return Tuple.create(element.getKey(), element.getValue());
+ }
+ });
+
+ return ZippedFlowImpl.create(tuples);
+ }
+
+ /**
* Creates a lazy Flow that returns integers in the given range. The range starts
* with the lower value and counts by 1 up to the upper range (which is not part of
* the Flow). If lower equals upper, the Flow is empty. If upper is less than lower,
Modified: tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/ZippedFlow.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/ZippedFlow.java?rev=1055679&r1=1055678&r2=1055679&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/ZippedFlow.java (original)
+++ tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/ZippedFlow.java Wed Jan 5 22:59:13 2011
@@ -14,6 +14,8 @@
package org.apache.tapestry5.func;
+import java.util.Map;
+
/**
* The result of the {@link Flow#zipWith(Flow)} method, a Flow of combined {@link Tuple} values
* (that can be deconstructed, eventually, using {@link #unzip()}).
@@ -74,4 +76,10 @@ public interface ZippedFlow<A, B> extend
* is a lazy operations.
*/
ZippedFlow<A, B> removeOnSecond(Predicate<? super B> predicate);
+
+ /**
+ * Constructs a HashMap by converting the tuples of the zipped flow into keys (first tuple value) and values (second
+ * tuple value).
+ */
+ Map<A, B> toMap();
}
Modified: tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/ZippedFlowImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/ZippedFlowImpl.java?rev=1055679&r1=1055678&r2=1055679&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/ZippedFlowImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-func/src/main/java/org/apache/tapestry5/func/ZippedFlowImpl.java Wed Jan 5 22:59:13 2011
@@ -15,8 +15,10 @@
package org.apache.tapestry5.func;
import java.util.Comparator;
+import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import java.util.Set;
/**
@@ -208,4 +210,19 @@ class ZippedFlowImpl<A, B> implements Zi
return filterOnSecond(predicate.invert());
}
+ public Map<A, B> toMap()
+ {
+ final Map<A, B> result = new HashMap<A, B>();
+
+ tupleFlow.each(new Worker<Tuple<A, B>>()
+ {
+ @Override
+ public void work(Tuple<A, B> value)
+ {
+ result.put(value.first, value.second);
+ }
+ });
+
+ return result;
+ }
}
Modified: tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/ZippedFlowTests.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/ZippedFlowTests.java?rev=1055679&r1=1055678&r2=1055679&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/ZippedFlowTests.java (original)
+++ tapestry/tapestry5/trunk/tapestry-func/src/test/java/org/apache/tapestry5/func/ZippedFlowTests.java Wed Jan 5 22:59:13 2011
@@ -15,7 +15,10 @@
package org.apache.tapestry5.func;
import java.util.Arrays;
+import java.util.Comparator;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.commons.lang.StringUtils;
@@ -30,6 +33,36 @@ public class ZippedFlowTests extends Bas
ZippedFlow<Integer, String> zipped = numbers.zipWith(names);
@Test
+ public void zipped_flow_to_map()
+ {
+ Map<Integer, String> map = zipped.toMap();
+
+ assertEquals(map.size(), 3);
+ assertEquals(map.get(2), "barney");
+ }
+
+ @Test
+ public void map_to_zipped_flow()
+ {
+ Map<Integer, String> map = new HashMap<Integer, String>();
+ map.put(1, "fred");
+ map.put(2, "barney");
+
+ ZippedFlow<Integer, String> zipped = F.zippedFlow(map);
+
+ ZippedFlow<Integer, String> sorted = zipped.sort(new Comparator<Tuple<Integer, String>>()
+ {
+ public int compare(Tuple<Integer, String> o1, Tuple<Integer, String> o2)
+ {
+ return o1.second.compareTo(o2.second);
+ }
+ });
+
+ assertFlowValues(sorted.firsts(), 2, 1);
+ assertFlowValues(sorted.seconds(), "barney", "fred");
+ }
+
+ @Test
public void filter_on_first()
{
assertFlowValues(zipped.filterOnFirst(F.eql(3)).seconds(), "wilma");