方法引用什么时候起作用?
When do method references work?
方法引用不适用于非静态方法 AFAIK。我尝试在 following way
中使用它们
Arrays.stream(new Integer[] {12,321,312}).map(Integer::toString).forEach(System.out::println);
这导致了link中看到的编译错误。
问题
在使用 AssertJ
库时,我使用了类似这样的东西,
AbstractObjectAssert<?, Feed> abstractObjectAssertFeed2 = assertThat(feedList.get(2));
abstractObjectAssertFeed2.extracting(Feed::getText).isEqualTo(new Object[] {Constants.WISH+" HappyLife"});
其中 Feed
是一个名词,getText
是一个 getter 方法, 不是静态的 ,但它工作正常,没有编译错误或任何让我困惑的错误。
我是否遗漏了一些有关方法引用如何工作的信息?
由于其他原因,这无效。
在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
作为方法参考。第一个是对 static method
的方法引用。第二个是 Reference to an instance method of an arbitrary object of a particular type
。
由于它们都符合条件,编译器不知道该选择哪个。
方法引用不适用于非静态方法 AFAIK。我尝试在 following way
中使用它们Arrays.stream(new Integer[] {12,321,312}).map(Integer::toString).forEach(System.out::println);
这导致了link中看到的编译错误。
问题
在使用 AssertJ
库时,我使用了类似这样的东西,
AbstractObjectAssert<?, Feed> abstractObjectAssertFeed2 = assertThat(feedList.get(2));
abstractObjectAssertFeed2.extracting(Feed::getText).isEqualTo(new Object[] {Constants.WISH+" HappyLife"});
其中 Feed
是一个名词,getText
是一个 getter 方法, 不是静态的 ,但它工作正常,没有编译错误或任何让我困惑的错误。
我是否遗漏了一些有关方法引用如何工作的信息?
由于其他原因,这无效。
在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
作为方法参考。第一个是对 static method
的方法引用。第二个是 Reference to an instance method of an arbitrary object of a particular type
。
由于它们都符合条件,编译器不知道该选择哪个。