Though it probably does not matter, I just wanted to add, that the
chained lambda does null checks for the contained object for every #map
call in the chain. Except for the property model, neither of the others
does that - at least, as far as I could see.
So the following, quickly hacked together solution should be equivalent
to chained #map calls.
if (accountModel.getObject() != null &&
accountModel.getObject().getPerson() != null &&
accountModel.getObject().getPerson().getName() != null)
{
return accountModel.getObject().getPerson().getName();
}
else
{
return null;
}
On 10.11.2016 21:01, Martijn Dashorst wrote:
> I just did a micro benchmark to see which is faster.
>
> The project is here:
>
> https://github.com/dashorst/wicket-benchmarks
>
> You can see the test code here:
>
> https://github.com/dashorst/wicket-benchmarks/blob/master/src/main/java/com/martijndashorst/wicketbenchmarks/LambdaModels.java
>
> The results are (on my laptop) for this particular run (10 warmup
> rounds for each iteration of 1s, each benchmark consists of 10
> iterations of 10 seconds each):
>
> LambdaModels.nativeEvaluation thrpt 10 357854132.948 ±
> 5459963.153 ops/s
> LambdaModels.abstractReadOnlyModel thrpt 10 261693660.899 ±
> 2008898.403 ops/s
> LambdaModels.directLambdaModel thrpt 10 216231074.508 ±
> 3866874.908 ops/s
> LambdaModels.chainedLambdaModel thrpt 10 152373429.346 ±
> 938206.534 ops/s
> LambdaModels.propertyModel thrpt 10 2180390.984 ±
> 72875.218 ops/s
>
> In other words:
>
> if property model has performance of 1, a chained lamda has a better
> performance of 70x that. The direct lambda model has a performance of
> 99x a property model, retrieving a property value directly using a
> abstract read only model is 120x more performant than a property
> model. And just directly getting the value of the property without
> wrapping it in a model is 164x faster than using a property model.
>
> Will this matter? Probably a little bit for your overall application
> if it is heavily used. If you have a page with lots of property models
> you can do a lot better by using lambda models if you need the
> dynamism.
>
> Martijn
>
>
> On Thu, Nov 10, 2016 at 1:38 PM, Martijn Dashorst
> <[email protected]> wrote:
>> IModel<String> m =
>> LoadableDetachableModel
>> .of(Person::new)
>> .map(Person::getName);
>>
>> So much sexiness with lambda's and models...
>>
>> IModel<Account> a = ...;
>> IModel<Person> p = a.map(Account::getPerson);
>>
>> add(new Label("firstName", p.map(Person::getFirstName));
>> add(new Label("lastName", p.map(Person::getLastName));
>>
>> Too bad Java doesn't have properties as a language construct. That
>> would make this even better:
>>
>> IModel<Account> a = ...;
>> IModel<Person> p = a.map(Account::person);
>>
>> add(new Label("firstName", p.map(Person::firstName));
>> add(new Label("lastName", p.map(Person::lastName));
>>
>> Martijn
>>
>> On Thu, Nov 10, 2016 at 1:17 PM, Martin Grigorov <[email protected]>
>> wrote:
>>> grep Label | grep '::' wicket-examples/src/main/java/
>>> wicket-examples/src/main/java/org/apache/wicket/examples/
>>> ajax/builtin/FileUploadPage.java
>>> 87: form.add(new Label("max", form::getMaxSize));
>>>
>>> wicket-examples/src/main/java/org/apache/wicket/examples/
>>> ajax/builtin/GuestBook.java
>>> 78: listItem.add(new Label("date", comment::getDate));
>>>
>>> wicket-examples/src/main/java/org/apache/wicket/examples/
>>> compref/LabelPage.java
>>> 45: add(new Label("dynamicLabel", Date::new));
>>>
>>> wicket-examples/src/main/java/org/apache/wicket/examples/
>>> compref/LinkPage.java
>>> 48: link1.add(new Label("label1", count1::toString));
>>>
>>>
>>> Martin Grigorov
>>> Wicket Training and Consulting
>>> https://twitter.com/mtgrigorov
>>>
>>> On Thu, Nov 10, 2016 at 1:05 PM, Emond Papegaaij <[email protected]
>>>> wrote:
>>>
>>>> Didn't we make IModel a functional interface with default methods for
>>>> setObject and detach? In that case, you can simply use a method reference
>>>> as
>>>> your model.
>>>>
>>>> Emond
>>>>
>>>> On donderdag 10 november 2016 12:56:50 CET Martijn Dashorst wrote:
>>>>> I'm working on replacing my AROM's and often they just call a getter.
>>>>> In that case I'd rather use a method reference than doing the IModel
>>>>> replacement.
>>>>>
>>>>> Is there a reason why the LambdaModel doesn't have a path for only a
>>>> getter?
>>>>>
>>>>> This way I can do:
>>>>>
>>>>> public A(String p, final SerializableSupplier<Boolean> visibility)
>>>>> {
>>>>> this(p);
>>>>> condition = LambdaModel.of(visibility);
>>>>> }
>>>>>
>>>>> instead of:
>>>>>
>>>>> public A(String p, final SerializableSupplier<Boolean> visibility)
>>>>> {
>>>>> this(p);
>>>>> condition = new IModel<Boolean>() {
>>>>> private static final long serialVersionUID = 1L;
>>>>>
>>>>> @Override
>>>>> public Boolean getObject() {
>>>>> return visibility.get();
>>>>> }
>>>>> };
>>>>> }
>>>>>
>>>>> I have the code ready to push, shall I?
>>>>>
>>>>> Martijn
>>>>
>>>>
>>>>
>>
>>
>>
>> --
>> Become a Wicket expert, learn from the best: http://wicketinaction.com
>
>
>