Lambda引用字段

Dan*_*kov 35 java lambda java-8

我想知道如何获得lambda对字段的引用.我不想使用方法,因为我的字段是公共最终的.我怀疑这是不可能的,但我没有看到明显的陈述.

class A {
   public final String id;
   ...
}

Map<String, A> f(List<A> l) {
   return l.stream().collect(Collectors.toMap(A::id, Function.identity()));
}
Run Code Online (Sandbox Code Playgroud)

Bri*_*etz 43

听起来你希望Java具有相应的字段引用功能,就像它对方法引用一样.但这种情况并非如此.方法引用是某种类型的lambda表达式的简写,但是没有相应的字段语法.在JSR-335专家组审议期间探讨了字段文字(这里有一些参考文献http://mail.openjdk.java.net/pipermail/lambda-dev/2011-November/004235.html)但未包括在内在Java SE 8中.

  • 对我来说,这才是真正的答案。包括非常有用的背景信息。 (4认同)

Era*_*ran 26

您始终可以使用lambda表达式:

return l.stream().collect(Collectors.toMap(a -> a.id, Function.identity()));
Run Code Online (Sandbox Code Playgroud)

我认为"方法引用"由于某种原因以这种方式调用,因此仅适用于方法.

  • 有没有人注意到每个` - >`生成一个新方法?我们应该尽可能选择方法参考语法.很遗憾没有田地. (7认同)
  • @Holger是的,但更短的代码并不总是人们正在寻找的东西.如果是,我们都将命名我们的类和变量a,b,c,d,... :).有些人可能更喜欢方法引用语法而不是lambda表达式. (2认同)
  • 它并不总是人们正在寻找的东西,但在这个特定的情况下[OP说自己"我想要一个参考,因为它更短"](http://stackoverflow.com/questions/27467946/java8-lambda-reference-to-a -field/27467956?noredirect = 1#comment43374811_27467946) (2认同)