Author: markt Date: Tue Jul 16 11:52:45 2013 New Revision: 1503667 URL: http://svn.apache.org/r1503667 Log: EL 3.0 collections operations. Implement reduce.
Modified: tomcat/trunk/java/org/apache/el/stream/Optional.java tomcat/trunk/java/org/apache/el/stream/Stream.java tomcat/trunk/test/org/apache/el/stream/TestCollectionOperations.java Modified: tomcat/trunk/java/org/apache/el/stream/Optional.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/stream/Optional.java?rev=1503667&r1=1503666&r2=1503667&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/el/stream/Optional.java (original) +++ tomcat/trunk/java/org/apache/el/stream/Optional.java Tue Jul 16 11:52:45 2013 @@ -16,6 +16,50 @@ */ package org.apache.el.stream; +import javax.el.ELException; +import javax.el.LambdaExpression; + public class Optional { + private final Object obj; + + static final Optional EMPTY = new Optional(null); + + Optional(Object obj) { + this.obj = obj; + } + + + public Object get() throws ELException { + if (obj == null) { + throw new ELException(); + } else { + return obj; + } + } + + + public void ifPresent(LambdaExpression le) { + if (obj != null) { + le.invoke(obj); + } + } + + + public Object orElse(Object other) { + if (obj == null) { + return other; + } else { + return obj; + } + } + + + public Object orElseGet(LambdaExpression le) { + if (obj == null) { + return le.invoke((Object[]) null); + } else { + return obj; + } + } } Modified: tomcat/trunk/java/org/apache/el/stream/Stream.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/stream/Stream.java?rev=1503667&r1=1503666&r2=1503667&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/el/stream/Stream.java (original) +++ tomcat/trunk/java/org/apache/el/stream/Stream.java Tue Jul 16 11:52:45 2013 @@ -261,6 +261,32 @@ public class Stream { } + public Optional reduce(LambdaExpression le) { + Object seed = null; + + if (iterator.hasNext()) { + seed = iterator.next(); + } + + if (seed == null) { + return Optional.EMPTY; + } else { + return new Optional(reduce(seed, le)); + } + } + + + public Object reduce(Object seed, LambdaExpression le) { + Object result = seed; + + while (iterator.hasNext()) { + result = le.invoke(result, iterator.next()); + } + + return result; + } + + private static class LambdaExpressionComparator implements Comparator<Object>{ Modified: tomcat/trunk/test/org/apache/el/stream/TestCollectionOperations.java URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/el/stream/TestCollectionOperations.java?rev=1503667&r1=1503666&r2=1503667&view=diff ============================================================================== --- tomcat/trunk/test/org/apache/el/stream/TestCollectionOperations.java (original) +++ tomcat/trunk/test/org/apache/el/stream/TestCollectionOperations.java Tue Jul 16 11:52:45 2013 @@ -20,6 +20,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; +import javax.el.ELException; import javax.el.ELProcessor; import org.junit.Assert; @@ -324,4 +325,39 @@ public class TestCollectionOperations { Assert.assertArrayEquals(expected, (Object[]) result); } + + @Test + public void testReduceLambda01() { + ELProcessor processor = new ELProcessor(); + + Object result = processor.getValue( + "[1,2,3,4,5].stream().reduce((x,y)->x+y)", + Object.class); + + Assert.assertEquals(Long.valueOf(15), ((Optional) result).get()); + } + + + @Test(expected=ELException.class) + public void testReduceLambda02() { + ELProcessor processor = new ELProcessor(); + + Object result = processor.getValue( + "[].stream().reduce((x,y)->x+y)", + Object.class); + + ((Optional) result).get(); + } + + + @Test + public void testReduceLambdaSeed01() { + ELProcessor processor = new ELProcessor(); + + Object result = processor.getValue( + "[1,2,3,4,5].stream().reduce(10, (x,y)->x+y)", + Object.class); + + Assert.assertEquals(Long.valueOf(25), result); + } } --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org