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

标签 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()));

似乎我应该能够使用 lambda 表达式内联它,但我想不出一个可以编译的。 (我对 lambdas 很陌生,所以这不足为奇。)

谢谢。

--> 更新:

如已接受的答案中所述

Person::getLast

是我一直在寻找的,也是我尝试过的。然而,Eclipse 4.3 的 BETA_8 nightly build 是个问题——它标记为错误。从命令行编译时(我应该在发布之前完成),它起作用了。因此,是时候向 eclipse.org 提交错误了。

谢谢。

最佳答案

您可以使用 lambda:

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

或者,更简洁地说,您可以使用 method reference使用 :::

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

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

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

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

关于java - Collectors.toMap() keyMapper——更简洁的表达方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19254884/

相关文章:

java - JPopupMenu 菜单项和组件

java - 如何使用 "Person"列表创建整数集合?

c++ - 头文件中的内联 lambda

c++ - 包装的 lambda 表达式

java - 如何从编译时未知的索引处的局部变量加载引用?

java - 如何在大文本文件的开头插入文本?

java - 来自 servlet java.lang.RuntimeException : Driver org. hsqldb.jdbc.JDBCDriver 的未捕获异常声称不接受 jdbcUrl、jdbc:mysql:///iworks_db

python - Python中将两个字典合并为字典的字典

java - 使用迭代器删除条目的程序

java - 可运行对象与方法引用和垃圾