【问题标题】:Method reference does not compile - Integer::new方法引用无法编译 - Integer::new
【发布时间】:2016-07-14 18:39:45
【问题描述】:

为什么不编译?

Stream.generate(Integer::new(1)).limit(10);

它给出了错误

令牌“新”的语法错误,此令牌后应为 AssignmentOperator

当然,我可以把这个表达式改写成

Stream.generate(() -> new Integer(1)).limit(10);

但我想知道第一个语句失败的原因......

【问题讨论】:

  • 你不能为方法引用提供额外的参数。因此,您必须改用 lambda 表达式。但无论如何,使用Integer 的构造函数是没有意义的。你可以使用Stream.generate( () -> 1)...
  • 因为Integer::new(1) 不是有效的方法/构造函数引用。 JLS

标签: java java-8 method-reference


【解决方案1】:

您不能将参数显式传递给方法引用。它们只能隐式传递。

例如,如果您有一个 IntStream,您可以使用 public Integer(int value) 构造函数的方法引用将其 mapToObj Integer 实例:

IntStream.of(1,1,1).mapToObj(Integer::new)...

当然,对小的int 值使用public Integer(int value) 构造函数通常是一个坏主意,因为它可能会导致创建不必要的多个实例,所有实例都具有相同的int 值,而不是利用IntegerCache,缓存小值(-128 到 127)的 Integer 实例。

【讨论】:

  • IntStream.of(1,1,1).boxed() 以避免创建过时的实例...
  • @Holger 是的,我从来没有说过这段代码有意义。我只演示了如何使用方法引用来调用 Integer(int) 构造函数。
  • 我想说,无论int 的实际值如何,都应该首选使用自动装箱或显式Integer.valueOf。确实只保证缓存小的值,但这并不排除其他值被缓存,并且使用工厂还记录开发人员不对对象身份做出任何假设,换句话说,通常允许缓存,无论是会发生与否。甚至 JVM 端的优化也是可能的,因为 JVM 知道这种方法。
猜你喜欢
  • 1970-01-01
  • 2019-01-16
  • 2019-08-13
  • 1970-01-01
  • 2019-10-21
  • 2016-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多