函数式接口转Lambda表达式报错,求正确实现方法
解决Lambda表达式赋值时的语法错误问题
你在给函数式接口实例赋值Lambda的时候踩了个语法小坑,咱们一步步把它修正过来:
错误原因分析
你的Lambda参数列表写法完全不对——当有多个参数时,必须用**圆括号()**把参数声明括起来,而不是直接放字面量。你现在写的("yxc", 3)是把具体值硬塞进去,这根本不是合法的参数声明逻辑,编译器自然会抛出“赋值语句的左侧必须是变量”的错误(本质是Lambda语法不合法,导致编译器无法识别你要赋值的是接口实例)。
不过好在你的MyInterface1接口是符合函数式接口要求的:它只有一个抽象方法method1,default和static方法都不会影响函数式接口的判定。
正确的代码写法
写法1:显式声明参数类型
public interface MyInterface1 { default public void defaultMethod1(String text, int i){ System.out.println("defaultMethod1: " + text + " " + i + "times"); } default public void defaultMethod2(String text, int i){ System.out.println("defaultMethod2: " + text + " " + i + "times"); } static void printItToSystemOut(String text){ System.out.println(text); } int method1(String s, int i); } public class Main { public static void main(String[] args) { // 显式指定参数类型,用圆括号完整包裹参数列表 MyInterface1 myInterface = (String s, int i) -> { return 3; }; } }
写法2:省略参数类型(编译器自动推导)
如果参数类型能被上下文(这里就是MyInterface1中method1的方法签名)自动推导出来,你可以省略参数类型,只保留参数名:
public class Main { public static void main(String[] args) { // 省略参数类型,依然要用圆括号括起参数列表 MyInterface1 myInterface = (s, i) -> { return 3; }; } }
写法3:简化单行返回的Lambda
如果Lambda体只有一行返回语句,还可以进一步省略大括号和return关键字,让代码更简洁:
public class Main { public static void main(String[] args) { MyInterface1 myInterface = (s, i) -> 3; } }
额外小提示
Lambda参数列表的通用规则:
- 无参数:必须写
(),比如() -> System.out.println("hello") - 单个参数:可以省略圆括号,比如
str -> str.length(),也可以写成(str) -> str.length() - 多个参数:必须用圆括号括起来,不管有没有显式声明类型
内容的提问来源于stack exchange,提问作者Amrmsmb
相关产品推荐
相关产品推荐

