Velvet Star Monitor

Standout celebrity highlights with iconic style.

news

Collectors.toMap() keyMapper -- more succinct expression?

Writer Sophia Terry

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.

2

3 Answers

You can use a lambda:

Collectors.toMap(p -> p.getLast(), Function.identity())

or, more concisely, you can use a method reference using :::

Collectors.toMap(Person::getLast, Function.identity())

and instead of Function.identity, you can simply use the equivalent lambda:

Collectors.toMap(Person::getLast, p -> p)

If you use Netbeans you should get hints whenever an anonymous class can be replaced by a lambda.

5
List<Person> roster = ...;
Map<String, Person> map = roster .stream() .collect( Collectors.toMap(p -> p.getLast(), p -> p) );

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(...)

1

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

Map<String, Person> map =
roster .stream() .collect( Collectors.toMap(p -> p.getLast(), p -> p, (person1, person2) -> person1+";"+person2) );
2

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy