You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@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");