Hi,

I like the functionality provided by ReadOnlyModel!
I have two questions/doubts:
- whether those transformations should be done by a Model or it would be
better to be done by Functions and finally a Model would consume the result
- if this functionality should be in a model then in which class?
-- AbstractReadOnlyModel is deprecated. Maybe we should un-deprecate it ?!
-- the name "ReadOnlyModel" doesn't tell me what nice functionality I could
expect from it. But on the side all these methods should be provided only
by a read-only model. Or not? I see they can easily be put in IModel class,
but then the developer should be careful with the usage of #setObject()

I think a better solution would be a read-write Model that uses composition
of functions internally for all the transformations. #setObject() will
manipulate the model's object. #getObject() will apply the model object to
the composed function to get the final result.


Martin Grigorov
Wicket Training and Consulting
https://twitter.com/mtgrigorov

On Fri, Apr 22, 2016 at 10:52 PM, Matthias Metzger <
[email protected]> wrote:

> Hi,
>
>
> thanks to all of you for the interest! I just added some examples to the
> README of my repository and implemented an alternative to/enhanced the
> LambdaColumn. Hope this makes your life a little easier. If there is
> anything else I can do for that matter, just hit me up.
>
>
> @Carl-Eric: I am very keen to see what you'll come up with. Mapping over
> everything with a <T> was the best I could think of, without resorting to
> reflection. :D
>
> Regards,
> Matthias
>
>
> ________________________________
> Von: Carl-Eric Menzel <[email protected]>
> An: [email protected]
> Gesendet: 10:10 Freitag, 22.April 2016
> Betreff: Re: Further Lambda Model ideas
>
>
> Hi Matthias,
>
> interesting ideas, thank you for sharing! I'm going to have a closer
> look either this weekend or next (a bit busy right now). Currently I'm
> working on some Java 8 helpers for Wicket 7, similar to the LambdaModel
> thing currently in WicketStuff. I'm doing that mostly to just play
> around with some ideas but also because I'm not entirely happy with the
> WicketStuff LambdaModel - basically I'm exploring to see whether I can
> come up with something I like better.
>
> Carl-Eric
>
>
> On Thu, 21 Apr 2016 20:19:52 +0000 (UTC)
> Matthias Metzger <[email protected]> wrote:
>
> > Hello everyone,
> > I just saw yesterday, that the IModel became/will become a
> > @FunctionalInterface in Wicket 8 and was very happy about it. I am
> > also very happy about the ongoing implementations and discussions
> > around lambda usage in Wicket, because it simplifies a lot of code.
> > Now, one thing I have been working on, is implementing some of the
> > now known methods of Stream<T> for a AbstractReadOnlyModel and also
> > for other things - like columns. I have not seen such discussions on
> > here, please forgive me if I missed that. If it has indeed not been
> > discussed and you find the idea useful, you can take a look at an
> > implementation in the following repository:
> >
> https://github.com/noobymatze/lambdawicket-model/blob/master/src/main/java/com/github/noobymatze/lambdawicket/model/ReadOnlyModel.java
> >
> > What might we be able to do with that?
> > Consider a Person containing an Address, containing a Street with a
> > name. Now I want to display the name of the street. How would I go
> > about that?new Label("streetName", () ->
> > person.getAddress().getStreet().getName()); This is one approach, but
> > it completely ignores the possibility of null values and a default
> > value for such cases. I could wrap the above in an Optional or create
> > a method in the Person class like 'Optional<String> getStreetName()
> > {...}'.
> >
> > With the proposed ReadOnlyModel I could also do it in the following
> > way: new Label("streetName", ReadOnlyModel.of(person).
> > map(Person::getAddress).  map(Address::getStreet).
> > map(Street::getName).  orElse("n/a")); But that's not all. Imagine we
> > would need to dynamically truncate the streetName based on user
> > input: IModel<WicketFunction<String, String>> truncate = () -> str ->
> > str.length() > 10 ? str.substring(0, 10) + "..." : str;
> > IModel<String> truncatedStreetName = ReadOnlyModel.of(person).
> > map(Person::getAddress).    map(Address::getStreet).
> > map(Street::getName).    apply(truncate).    orElse("n/a"); Now we
> > could switch the truncate Model using a
> > DropDownChoice<WicketFunction<String, String>> or by just setting the
> > contained function somewhere.truncate.setObject(str ->
> > str.substring(0, 20));
> >
> > The whole approach is - if I am not mistaken - heavier on memory,
> > because instead of one IModel<String> we now have 5 or 6 Models, that
> > cannot be garbage collected, because they are all needed to perform
> > the computation.
> >
> > This doesn't apply for mapping over an IColumn though, because it
> > doesn't need to rely on the laziness, like the ReadOnlyModel does
> > (otherwise a change in truncate wouldn't mean a change in the final
> > value), so:new LambdaColumn(of("Name"), Person::getAddress).
> > map(Address::getStreet).  map(Street::getName).  orElse("n/a"));
> > would create 4 new instances of the LambdaColumn, but 3 of them could
> > be gc'd more or less the second they were created - like I said, if I
> > am not mistaken. If this is at all an approach you think might be
> > useful, I would be happy to provide the implementation of the
> > LambdaColumn. Otherwise just ignore my message. :) Have a nice
> > day,Matthias
>

Reply via email to