我对lambdas有一点疑问。我用以下代码得到以下错误。如果我正在调用一个返回布尔值或其他类型的方法,我没有看到这个问题。我怎么能解决这个问题?
错误:
线程“main”中的异常java.lang.Error:未解决的编译问题: Iterable类型中的forEach(Consumer)方法不适用于参数((bean) - > {}) 此表达式的目标类型必须是功能接口
at com.wipro.MethodReference.main(MethodReference.java:18)
package com.sample;
import com.student.MockClass;
import java.util.ArrayList;
import java.util.List;
public class MethodReference {
public static void main(String[] args) {
MockClass obj = new MockClass("JSP", 2);
MockClass obj1 = new MockClass("Java", 8);
List<MockClass> listofBeans = new ArrayList<MockClass>();
listofBeans.add(obj);
listofBeans.add(obj1);
listofBeans.forEach(bean -> MethodReference::call);
}
public static void call(){
System.out.println("Hii!!!");
}
}
答案 0 :(得分:3)
JLS描述了方法参考表达式:
如果T是函数接口类型(第9.8节)且表达式与地面目标类型的函数类型一致,则方法引用表达式在赋值上下文,调用上下文或具有目标类型T的转换上下文中是兼容的源自T。
所以你必须将它/分配/转换为功能界面。
listofBeans.forEach(bean-> ((Runnable)MethodReference::call).run());
相当于:
listofBeans.forEach(bean-> call());
答案 1 :(得分:1)
功能接口(在本例中为c <- temp
)的目的是通过流传递数据。您的方法Consumer
没有多大意义,因为它不接受任何参数并且不返回任何内容。你可以这样做但不能用方法参考。
请改为尝试:
call()
或
listofBeans.forEach(MethodReference::call);
public static void call(MockClass bean){...}