[ 
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)

Reply via email to