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: [email protected]
For additional commands, e-mail: [email protected]