freemarker-notifications mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Daniel Dekany (JIRA)" <>
Subject [jira] [Commented] (FREEMARKER-43) Consider adding a Java 8 Style forEach method to TemplateCollectionModel/TemplateSequenceModel
Date Thu, 08 Dec 2016 07:48:58 GMT


Daniel Dekany commented on FREEMARKER-43:

If that's indeed a tuple, then your Java class already provides some kind of ordering for
the elements. How does it do it? Does those Java classes, regardless for FreeMarker already
have that {{forEach(consumer)}} method for example? I'm asking because this sounds like an
{{ObjectWrapper}} responsibility. If the Java object has, for example, a {{forEach}} method,
then it's wrappable as {{TemplateCollectionModel}} right now, no need to add anything to it.
Only the {{ObjectWrapper}} implementation has to be aware of this pattern.

As of adding default methods to FreeMarker API interfaces, FreeMarker doesn't require Java
8, so we can use Java 8 features in its API-s (unless they are "optional" API-s that you can
avoid referring to).

> Consider adding a Java 8 Style forEach method to TemplateCollectionModel/TemplateSequenceModel
> ----------------------------------------------------------------------------------------------
>                 Key: FREEMARKER-43
>                 URL:
>             Project: Apache Freemarker
>          Issue Type: Improvement
>          Components: engine
>    Affects Versions: 2.3.25-incubating
>            Reporter: Thomas Weidner
>            Priority: Minor
> I have a lot of "tuple-like" types in my model. For example:
> {code:java}
> class Tuple {
>   int a;
>   float b;
>   String c;
> }
> {code}
> In the template, i would like to iterate through the components of tuple using #list.
To implement TemplateSequenceModel or TemplateCollectionModel, I basically need to create
a temporary List object from the tuple, which seems unnecessary. 
> Java 8 added a forEach model to java.lang.Iterable, which could be easily implemented
for Tuple without temporary objects:
> {code:java}
> // in Tuple
> void forEach(Consumer<Object> c) {
>   c.accept(a);
>   c.accept(b);
>   c.accept(c);
> }
> {code}
> Unfortunately, there is no such method in TemplateSequenceModel/TemplateCollectionModel.
> I propose to add such a method to the both classes and use this method in IteratorBlock
instead of handcrafted iteration. This would allow to more efficient iteration for custom
classes, while not imposing worse performance on "standard" collections/interfaces (these
also provide forEach in java8). 
> As this change would require java8, this API change would not break existing implementations
of Template*Model, as forEach could be implemented as default interface method.
> I could provide a prototype patch if requested.
> Maybe as a separate bug, TemplateCollectionModel, TemplateSequenceModel should both inherit
from a new TemplateIterableModel which only provides forEach.

This message was sent by Atlassian JIRA

View raw message