Java 8 方法引用什么时候起作用?

Java 8 方法引用什么时候起作用?,java-8,java-stream,method-reference,assertj,Java 8,Java Stream,Method Reference,Assertj,方法引用不适用于AFAIK的非静态方法。我试着把它们用在厨房里 这导致编译错误,如链接中所示 问题 在使用AssertJlibrary时,我使用了如下内容: AbstractObjectAssert<?, Feed> abstractObjectAssertFeed2 = assertThat(feedList.get(2)); abstractObjectAssertFeed2.extracting(Feed::getText).isEqualTo(new Object[] {C

方法引用不适用于AFAIK的非静态方法。我试着把它们用在厨房里

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

问题
在使用
AssertJ
library时,我使用了如下内容:

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

AbstractObjectAssert这是无效的,原因不同

Integer
中,基本上有两种
toString
实现

static toString(int)

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

 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
,这两个函数都可以作为方法引用。第一个是对
静态方法的方法引用。第二个是对特定类型的任意对象的实例方法的引用


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

不是第一个
整数。toString(i)
?@Tarunmagni是的,我也可以这样写(没有警告),但我认为你更容易理解这里的意思……因此,这是因为歧义。如果您可以添加表格的图片,这将更有帮助-好的。知道了。我忘记了对象可以用来访问静态方法。如果要打印流内容,实际上不需要将
整数
映射到
字符串
<代码>数组.stream(新整数[]{12321312}).forEach(System.out::println)工作正常。您可以使用
.map(Object::toString)
而不是
.map(Integer::toString)
@antobalaniuc这是一个测试。我制作原型是为了确认方法引用是如何工作的,不幸的是(或者说它真的)遇到了这个问题(我认为这是真实的),并显示了我所期望的错误消息。机会有多大@安东巴拉纽克:当我没有面对同样的问题时,我应该说你标记的问题解决了我的问题,结果是一样的吗?你不应该忽略“2个错误”的页脚行,这表明你忽略了前面的另一个错误。通常,对于当前编译器,如果您看到两条错误消息,“非静态方法…无法从静态上下文引用”和另一个错误,请首先关注“另一个错误”。这会节省你很多时间。
/*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);