[
https://issues.apache.org/jira/browse/JEXL-266?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16581058#comment-16581058
]
Dmitri Blinov commented on JEXL-266:
------------------------------------
I've changed your test code a little and it failed, please look if you have
time. Apparently Uberspect.getIterator() is called in that case instead of
overloaded {{Arithmetic.forEach()}} since Map is not Iterable. We need to
change signature from
{{public Iterator<?> forEach(Iterable<?> collection)}}
to
{{public Iterator<?> forEach(Object value)}}
but how to invoke default implementation of {{Uberspect.getIterator()}} from
{{Arithmetic.forEach()}} ?
{code:java}
@Test
public void test266() throws Exception {
JexlEngine jexl = new JexlBuilder().arithmetic(new
Arithmetic266(true)).create();
JexlContext ctxt = new MapContext();
Map<String, Integer> li = new HashMap<String, Integer>();
li.put("a", 1);
li.put("b", 2);
li.put("c", 3);
li.put("d", 4);
li.put("e", 5);
li.put("f", 6);
ctxt.set("list", li);
Object result;
JexlScript script;
script = jexl.createScript("for (var item : list) { if (item <= 3)
remove(); } return size(list)");
result = script.execute(ctxt);
Assert.assertEquals(3, result);
}
{code}
> Allow to remove an element from iterator collection within for-loops
> --------------------------------------------------------------------
>
> Key: JEXL-266
> URL: https://issues.apache.org/jira/browse/JEXL-266
> Project: Commons JEXL
> Issue Type: New Feature
> Affects Versions: 3.1
> Environment: I have created a patch as initial implementation for
> this new feature, please see github pull request here
> [pr#5|https://github.com/apache/commons-jexl/pull/5]. I whould be very
> grateful if this could be interesting for the community and included in
> master branch. Thanks in advance!
> Reporter: Dmitri Blinov
> Priority: Minor
>
> The for-loop in JEXL provides a convenient way to iterate over different
> types of collections, however, its not possible for a script writer to
> utilize underlying
> {code:java}
> iterator.remove(){code}
> method within such a loop. The proposal is to introduce new {{remove}}
> statement which should be used within for-loops and should internally call
> {{iterator.remove()}} method and skip the loop to the next element;
> For example, the following code should remove items {{1,2,3}} from set and
> return value {{3}}.
> {code:java}
> var set = {1,2,3,4,5,6}; for (var item : set) if (item <= 3) remove; return
> size(set)
> {code}
--
This message was sent by Atlassian JIRA
(v7.6.3#76005)