提问者:小点点

方法引用什么时候起作用?[重复]


方法引用不适用于非静态方法AFAIK

Arrays.stream(new Integer[] {12,321,312}).map(Integer::toString).forEach(System.out::println);

这导致编译错误,如链接中所示。

问题
在使用AssertJ库时,我使用了这样的东西,

AbstractObjectAssert<?, Feed> abstractObjectAssertFeed2 = assertThat(feedList.get(2));
abstractObjectAssertFeed2.extracting(Feed::getText).isEqualTo(new Object[] {Constants.WISH+" HappyLife"});

其中Feed是一个名词,getText是一个getter方法,不是静态的,但是它工作得很好,没有编译错误或任何让我困惑的错误。

我是否遗漏了方法引用的工作原理?


共1个答案

匿名用户

由于不同的原因,这是无效的。

Integer中基本上有两个toString实现。

static toString(int)

/*non- static*/ toString()

这意味着您可以像这样编写流:

 Arrays.stream(new Integer[] { 12, 321, 312 })
       .map(i -> i.toString(i))
       .forEach(System.out::println);

Arrays.stream(new Integer[] { 12, 321, 312 })
       .map(i -> i.toString())
       .forEach(System.out::println);

这两个都可以通过Integer::toString作为方法引用。第一个是对静态方法的方法引用。第二个是对特定类型的任意对象的实例方法的引用。

由于它们都符合条件,编译器不知道选择哪个。