+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 >>>>> >>>> >>>> >>>> >