java lambda表达式
一、lambda表达式的语法
假设要计算first.length() - second.length且传入的参数是first和second,那么我们的lambda表达式可以这么写
1、(String first, String second) -> {return first.length() - second.length;}
2、因为first和second是可以推导出来的时候可以把String给去掉:(first, second) -> {return first.length() - second.length;}
3、当只有一个表达式的时候可以把return和括号给去掉:(first, second) -> first.length() - second.length
4、假设只有一个参数的时候我们可以连括号都不要了:first -> System.out.println(first)
5、但是如果是没有参数的话,那么括号还是需要保留:() -> System.out.println("")
6、当表达式有多个出口的时候,如果需要返回值,则每个出口都要返回一样的类型
二、lambda表达式的要求
1、只有一个方法的抽象接口,并且需要这种接口的对象时候
这里以Comparator为例子,Comparator中只有一个接口 int compare(T var1, T var2);
那么我们可以使用Comparator<String> comp = (first, second) -> first.length() - second.length 来代替如下的复杂操作
class LengthComparator implements Comparator<String> { @Override public int compare(String s, String t1) { return s.length() - t1.length(); } } Comparator<String> comp = new LengthComparator()
2、当lambda作为一个运算子的时候,对应的接收函数该如何设置呢
如上显示了各个类型的函数式接口名称
BiFunction<String, String, Integer> biFunction = (first, second) -> first.length() - second.length();
System.out.println("bifunction result = " + biFunction.apply("aa", "bbbbbbb"));
注意,这里的返回值是Integer不能写成Int,因为参数均需要类的形式
三、方法的引用
1、表达式中只有一个方法无其他操作的时候,可以使用方法的饮用进行构造
假设 Timer timer = new Timer(1000, actionEvent -> System.out.println(actionEvent));
那么如果用方法的引用则是 Timer timer = new Timer(1000, System.out::println);
这里通过System.out::print指示编译器生成一个ActionListener
如上的例子是通过object::instanceMethod的方式,最终会调用System.out.println
那么方法引用一共有3种情况可以转化,并且转化成不同的表达式
1、object::instanceMethod
System.out::println等价于表达式x -> System.out.println(x)
这里System是类,out是System的静态成员变量,println是out变量对应的成员函数
2、Class::instanceMethod
String::compareToIgnoreCase等驾驭表达式 (x, y) -> x.compareToIgnoreCase(y)
3、Class::staticMethod
Math::pow等价于表达式 (x, y) -> Math.pow(x, y)
四、变量的作用域
lambda是可以捕获外部的变量,但是这些捕获的变量是不可变的,即在外部把该变量声明为final也不会报错的情况,那么对应捕获的变量在内部也是不可以修改的即对捕获的变量自动加上了final
那么外部可变的变量可以捕获么? 答案是不可以
String text = "123"; Runnable runable = () -> { System.out.println(text); }; // 正常 runable = () -> { text = "345"; System.out.println(text); }; // 编译不过
String text = "123"; Runnable runable = () -> { System.out.println(text); }; text = "456"; // 编译不过
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!