Author: markt
Date: Mon Jul 15 19:26:07 2013
New Revision: 1503433
URL: http://svn.apache.org/r1503433
Log:
EL 3.0 collections operations.
Implement sorted.
Modified:
tomcat/trunk/java/org/apache/el/stream/Stream.java
tomcat/trunk/java/org/apache/el/stream/StreamELResolverImpl.java
tomcat/trunk/test/org/apache/el/stream/TestCollectionOperations.java
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=1503433&r1=1503432&r2=1503433&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/el/stream/Stream.java (original)
+++ tomcat/trunk/java/org/apache/el/stream/Stream.java Mon Jul 15 19:26:07 2013
@@ -17,6 +17,8 @@
package org.apache.el.stream;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
@@ -29,10 +31,10 @@ import org.apache.el.lang.ELSupport;
public class Stream {
- private final Iterator<?> iterator;
+ private final Iterator<Object> iterator;
- public Stream(Iterator<?> iterator) {
+ public Stream(Iterator<Object > iterator) {
this.iterator = iterator;
}
@@ -117,6 +119,67 @@ public class Stream {
}
+ public Stream sorted() {
+ Iterator<Object> downStream = new OpIterator() {
+
+ private Iterator<Object> sorted = null;
+
+ @Override
+ protected void findNext() {
+ if (sorted == null) {
+ sort();
+ }
+ if (sorted.hasNext()) {
+ next = sorted.next();
+ foundNext = true;
+ }
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ private final void sort() {
+ List list = new ArrayList<>();
+ while (iterator.hasNext()) {
+ list.add(iterator.next());
+ }
+ Collections.sort(list);
+ sorted = list.iterator();
+ }
+ };
+ return new Stream(downStream);
+ }
+
+
+ public Stream sorted(final LambdaExpression le) {
+ Iterator<Object> downStream = new OpIterator() {
+
+ private Iterator<Object> sorted = null;
+
+ @Override
+ protected void findNext() {
+ if (sorted == null) {
+ sort(le);
+ }
+ if (sorted.hasNext()) {
+ next = sorted.next();
+ foundNext = true;
+ }
+ }
+
+ @SuppressWarnings({ "rawtypes", "unchecked" })
+ private final void sort(LambdaExpression le) {
+ List list = new ArrayList<>();
+ Comparator<Object> c = new LambdaExpressionComparator(le);
+ while (iterator.hasNext()) {
+ list.add(iterator.next());
+ }
+ Collections.sort(list, c);
+ sorted = list.iterator();
+ }
+ };
+ return new Stream(downStream);
+ }
+
+
public Iterator<?> iterator() {
return iterator;
}
@@ -131,6 +194,23 @@ public class Stream {
}
+ private static class LambdaExpressionComparator
+ implements Comparator<Object>{
+
+ private final LambdaExpression le;
+
+ public LambdaExpressionComparator(LambdaExpression le) {
+ this.le = le;
+ }
+
+ @Override
+ public int compare(Object o1, Object o2) {
+ return ELSupport.coerceToNumber(
+ le.invoke(o1, o2), Integer.class).intValue();
+ }
+ }
+
+
private abstract static class OpIterator implements Iterator<Object> {
protected boolean foundNext = false;
protected Object next;
Modified: tomcat/trunk/java/org/apache/el/stream/StreamELResolverImpl.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/el/stream/StreamELResolverImpl.java?rev=1503433&r1=1503432&r2=1503433&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/el/stream/StreamELResolverImpl.java (original)
+++ tomcat/trunk/java/org/apache/el/stream/StreamELResolverImpl.java Mon Jul 15
19:26:07 2013
@@ -68,7 +68,9 @@ public class StreamELResolverImpl extend
return new Stream(new ArrayIterator(base));
} else if (base instanceof Collection) {
context.setPropertyResolved(true);
- return new Stream(((Collection<?>) base).iterator());
+ @SuppressWarnings("unchecked")
+ Collection<Object> collection = (Collection<Object>) base;
+ return new Stream(collection.iterator());
}
}
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=1503433&r1=1503432&r2=1503433&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/el/stream/TestCollectionOperations.java
(original)
+++ tomcat/trunk/test/org/apache/el/stream/TestCollectionOperations.java Mon
Jul 15 19:26:07 2013
@@ -180,4 +180,35 @@ public class TestCollectionOperations {
Assert.assertEquals(expected, result);
}
+
+ @Test
+ public void testSorted01() {
+ ELProcessor processor = new ELProcessor();
+ Object result = processor.getValue(
+ "['c', 'd', 'b', 'a'].stream().sorted().toList()",
+ List.class);
+ List<String> expected = new ArrayList<>(4);
+ expected.add("a");
+ expected.add("b");
+ expected.add("c");
+ expected.add("d");
+
+ Assert.assertEquals(expected, result);
+ }
+
+
+ @Test
+ public void testSortedLambdaExpression01() {
+ ELProcessor processor = new ELProcessor();
+ Object result = processor.getValue(
+ "['c', 'd', 'b',
'a'].stream().sorted((x,y)->x.compareTo(y)*-1).toList()",
+ List.class);
+ List<String> expected = new ArrayList<>(4);
+ expected.add("d");
+ expected.add("c");
+ expected.add("b");
+ expected.add("a");
+
+ Assert.assertEquals(expected, result);
+ }
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]