+1 for #chained() .

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

On Tue, Nov 15, 2016 at 10:07 PM, Sven Meier <s...@meiers.net> wrote:

> Hi,
>
> >We could rename the methods taking an IModel as first parameter to
> >"chained" or "from".
>
> or "map":
>
>     LambdaModel.map(IModel, SerializableFunction, SerializableBiConsumer)
>
>     LambdaModel.map(IModel, SerializableFunction)
>
> Sven
>
>
>
> Am 15.11.2016 um 20:52 schrieb Emond Papegaaij:
>
>> IModel.map(Function) indeed is functionally equivalent to
>> LambdaModel.of(IModel, Function), but its memory footprint is
>> significantly larger (120 vs 80 bytes). Also, there's no equivalent
>> method for of(IModel, Function, BiConsumer). Naturally, we can add the
>> corresponding method, but it will remain much less efficient. These
>> chained models require an additional object.
>>
>> We've ran into similar problems many times at Topicus. Javac still is
>> very buggy when it comes to lambda type inference. IMHO the best
>> solution is to simply rename the methods to prevent the collisions.
>>
>> We could rename the methods taking an IModel as first parameter to
>> "chained" or "from". Another solution would be a builder API, but I
>> doubt that would make the code more readable.
>>
>> Best regards,
>> Emond
>>
>> On Tue, Nov 15, 2016 at 8:06 PM, Martin Grigorov <mgrigo...@apache.org>
>> wrote:
>>
>>> On Tue, Nov 15, 2016 at 2:51 PM, Emond Papegaaij <
>>> emond.papega...@topicus.nl
>>>
>>>> wrote:
>>>> It seems I've hit a bug in javac:
>>>> LambdaModelTest[46,61] reference to of is ambiguous:
>>>> <T>   of(SerializableSupplier<T>, SerializableConsumer<T>)
>>>> <X,T> of(IModel<X>,               SerializableFunction<X,T>)
>>>>
>>>> This clearly is wrong:
>>>> IModel<String> personNameModel = LambdaModel.of(
>>>>      () -> person.getName(),
>>>>      (name) -> person.setName(name));
>>>>
>>>> The first parameter could match both SerializableSupplier<T> and
>>>> IModel<X>,
>>>> but the second parameter only matches SerializableConsumer<T>. Eclipse
>>>> has
>>>> no
>>>> problem with this and compiles the code just fine.
>>>>
>>>> I guess it confuses it with SerializableFunction<String, Void>.
>>> Although, I
>>> agree it should return null to actually match.
>>>
>>> IMO we don't
>>> need org.apache.wicket.model.LambdaModel#of(org.apache.wicket.
>>> model.IModel<X>,
>>> org.danekja.java.util.function.serializable.SerializableFunction<X,T>)
>>> It gives the same
>>> as org.apache.wicket.model.IModel#map(SerializableFunction<? super T, R>
>>> mapper).
>>>
>>>
>>> This now surfaces due to the change in the constructor. This testcase
>>>> used
>>>> to
>>>> call new LambdaModel(...), which had the same signature as the first
>>>> 'of'.
>>>> I
>>>> had to change it to use the overloaded factory method.
>>>>
>>>> I see two possible solutions:
>>>>   - Change the name of the factory methodes, so they are no longer
>>>> overloaded
>>>> (suggestions for the names are welcome)
>>>>   - Add a cast to the calling code to circumvent the bug.
>>>>
>>>> IMHO both are ugly.
>>>>
>>>> Best regards,
>>>> Emond
>>>>
>>>> On dinsdag 15 november 2016 13:36:56 CET build...@apache.org wrote:
>>>>
>>>>> The Buildbot has detected a new failure on builder wicket-master while
>>>>> building wicket. Full details are available at:
>>>>> https://ci.apache.org/builders/wicket-master/builds/550
>>>>>
>>>>> Buildbot URL: https://ci.apache.org/
>>>>>
>>>>> Buildslave for this Build: bb_slave1_ubuntu
>>>>>
>>>>> Build Reason: The SingleBranchScheduler scheduler named
>>>>> 'on-wicket-master-commit' triggered this build Build Source Stamp:
>>>>>
>>>> [branch
>>>>
>>>>> master] b40e9e1cd9ad7a9ffc63ab6c329c8d9c8b78b924 Blamelist: Emond
>>>>>
>>>> Papegaaij
>>>>
>>>>> <papega...@apache.org>
>>>>>
>>>>> BUILD FAILED: failed compile
>>>>>
>>>>> Sincerely,
>>>>>   -The Buildbot
>>>>>
>>>>
>>>>
>>>>
>

Reply via email to