I'm trying to come up with a more succinct expression for the "keyMapper" function parameter in the following Collectors.toMap()
call:
List<Person> roster = ...;
Map<String, Person> map =
roster
.stream()
.collect(
Collectors.toMap(
new Function<Person, String>() {
public String apply(Person p) { return p.getLast(); }
},
Function.<Person>identity()));
It seems that I should be able to inline it using a lambda expression, but I cannot come up with one that compiles. (I'm quite new to lambdas, so that's not much of a surprise.)
Thanks.
--> Update:
As noted in the accepted answer
Person::getLast
is what I was looking for, and is something I had tried. However, the BETA_8 nightly build of Eclipse 4.3 was the problem -- it flagged that as wrong. When compiled from the command-line (which I should have done before posting), it worked. So, time to file a bug with eclipse.org.
Thanks.
that would be the translation, but i havent run this or used the API. most likely you can substitute p -> p, for Function.identity(). and statically import toMap(...)
We can use an optional merger function also in case of same key collision. For example, If two or more persons have the same getLast() value, we can specify how to merge the values. If we not do this, we could get IllegalStateException. Here is the example to achieve this...
You can use a lambda:
or, more concisely, you can use a method reference using
::
:and instead of
Function.identity
, you can simply use the equivalent lambda:If you use Netbeans you should get hints whenever an anonymous class can be replaced by a lambda.