Comparator
Maurizio Cimadamore
maurizio.cimadamore at oracle.com
Mon Jul 15 10:11:18 PDT 2013
On 15/07/13 18:06, Marc Petit-Huguenin wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA256
>
> On 07/15/2013 09:16 AM, Henry Jen wrote:
>> Or use the new static method,
>>
>> .sorted(Map.Entry<String, Integer>.comparingByValue())
> Nice! But it did not compile as it:
>
> .sorted(Map.Entry.comparingByValue())
Does the above works? I think Henry pasted wrong snippet, as you can't
really pass type-argument to a receiver in a static method call.
Maurizio
>
> worked, but I needed to reverse the order, so I had to use
>
> .sorted(Map.Entry.<String, Integer>comparingByValue().reversed())
>
> I am a little bit worried that finding the right syntax relies on try and fail.
>
>> Cheers, Henry
>>
>> On Jul 15, 2013, at 9:09 AM, Maurizio Cimadamore
>> <maurizio.cimadamore at oracle.com> wrote:
>>
>>> On 15/07/13 16:53, Marc Petit-Huguenin wrote:
>> Hi,
>>
>> I am trying to use a comparator on a Map.Entry<String, Integer> stream, and
>> I am not sure why this does not compile:
>>
>> .sorted(Comparator.comparing(Map.Entry::getValue))
>>>> This is as expected - the method reference Map.Entry is defined on a
>>>> generic class with unknown parameter types (some Map<K, V>) - therefore
>>>> the compiler needs the info from the target (in a top-down way) in
>>>> order to decide what the method reference looks like. But the target
>>>> type info is incomplete as it depends on inference variables on its
>>>> own.
>>>>
>>>> So the compiler ends up applying a simpler (arity-based only) check
>>>> during overload resolution - which means the compiler can't really pick
>>>> the right comparing() method ahead of the target-type.
>>>>
>>>> A shorter way to get this to compile should be this:
>>>>
>>>> .sorted(Comparator.comparing(Map.Entry<String, Integer>::getValue))
>>>>
>>>>
>>>> Let me know if that works for you.
>>>>
>>>> Maurizio
>> error: reference to comparing is ambiguous error: incompatible types:
>> Cannot instantiate inference variables T because of an inference loop
>>
>> (interestingly the second error was not present when using a build from
>> last week)
>>
>> These two compile:
>>
>> .sorted(Comparator.comparing((ToIntFunction<Map.Entry<String,
>> Integer>>)Map.Entry::getValue))
>>
>> .sorted(Comparator.comparing((Map.Entry<String, Integer> entry) ->
>> entry.getValue().intValue()))
>>
>> Thanks.
>>
>>>
> - --
> Marc Petit-Huguenin
> Email: marc at petit-huguenin.org
> Blog: http://blog.marc.petit-huguenin.org
> Profile: http://www.linkedin.com/in/petithug
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.12 (GNU/Linux)
>
> iQIcBAEBCAAGBQJR5CwIAAoJECnERZXWan7ECPoP/1rpw5hbSz/v/YfGNC/ssgVG
> aLfURFuciL9IBsUwPBt24p0ctbSWBC76NwplAipOuypl6GeFW+CfCVfqQWhBS6vs
> RdOp9CU73Ql5syf/o/6k/djBGwskDvIWLQ8MXjmbas+5oxc1n7LW/KvPEgmGeagn
> I9f2/WYfny0ErRKOrEcosaSJ0AwoddIy2RvAxW/KQpETAigxFYg5rZ+a6oQgPTaj
> kBlUqWEOHajLPww1KxGWeV5wJpakn1SOFMC1QL8mn/+ZNAM7wE2srBG55cQ1xUUO
> ZOlIIuj7De+ubMZeC3pJer7vWXZ64FFp7FTbVRqLxeTFxm6qyNd8VnPjEu3pdBhL
> ibPYQRd06nE6n3+0Igb+01LeuY8FXwAv8EcCxowYllJZfAopPnPTkyUXmYk35BsL
> iKj4jwt+Vs6Y1AxN5GNlOC0oaKv+Y5+LXezO/cOy7qMXEhX9vBN+YJnFkepmQz8H
> UUKgV364PacPrKbFAgFZ3MtxI3UJv9aUNW5Z69xUOPuIjHC06WwXivrHSTszjLjw
> E9GkM/QbUC5rf50/i+UfEET5+ujkz1YT2WwDmawNVxtPKqEMEtHBC4vUFj/1y2Te
> v4xKWXfeTCTB+dMbk3K3qnwoVBaGZt+vK8OPQL+g8De/J2QTgq0sfop9U5CZxBqQ
> wuMjkcrh6y67hKLaxfLj
> =lnOv
> -----END PGP SIGNATURE-----
More information about the lambda-dev
mailing list