Collectors.toMap()keyMapper - 更简洁的表达方式?

pfu*_*her 73 java collections lambda java-8 java-stream

我试图在下面的Collectors.toMap()调用中为"keyMapper"函数参数提供一个更简洁的表达式:

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()));
Run Code Online (Sandbox Code Playgroud)

似乎我应该能够使用lambda表达式来内联它,但我无法想出一个编译它的人.(我对lambdas很新,所以这并不奇怪.)

谢谢.

- >更新:

如接受的答案所述

Person::getLast
Run Code Online (Sandbox Code Playgroud)

是我在寻找的东西,也是我尝试过的东西.然而,Eclipse 4.3的BETA_8每晚构建是问题 - 它标记为错误.从命令行编译时(我应该在发布之前完成),它起作用了.所以,是时候用eclipse.org提交bug了.

谢谢.

ass*_*ias 181

你可以使用lambda:

Collectors.toMap(p -> p.getLast(), Function.identity())
Run Code Online (Sandbox Code Playgroud)

或者,更简洁,您可以使用方法参考使用:::

Collectors.toMap(Person::getLast, Function.identity())
Run Code Online (Sandbox Code Playgroud)

而不是Function.identity,你可以简单地使用等效的lambda:

Collectors.toMap(Person::getLast, p -> p)
Run Code Online (Sandbox Code Playgroud)

如果您使用Netbeans,只要匿名类可以被lambda替换,您就应该得到提示.

  • 您可以通过删除括号来缩短表达式,因为单个参数不需要它们,即`Collectors.toMap(Person :: getLast,p - > p)`. (2认同)
  • 呵呵,似乎p - > p以某种方式进行了优化,没有构建新的编译匿名类.我猜它在内部使用Function.identity(),而不是创建一个无用的类. (2认同)

aep*_*iet 29

List<Person> roster = ...;

Map<String, Person> map = 
    roster
        .stream()
        .collect(
            Collectors.toMap(p -> p.getLast(), p -> p)
        );
Run Code Online (Sandbox Code Playgroud)

这将是翻译,但我没有运行或使用API​​.很可能你可以用p - > p代替Function.identity().并静态导入到地图(...)


Kay*_*ayV 5

在相同的密钥冲突的情况下,我们也可以使用可选的合并功能.例如,如果两个或更多人具有相同的getLast()值,我们可以指定如何合并这些值.如果我们不这样做,我们可能会得到IllegalStateException.以下是实现此目的的示例......

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