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作为一个运算子的时候,对应的接收函数该如何设置呢

如上显示了各个类型的函数式接口名称

那么以(first, second) -> first.length() - second.length为例,应该对应怎样的函数式呢? 两个参数一个返回值那么应该是BiFunction, 如下的例子所示
        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"; // 编译不过

 

 

 

 

 

 
posted @   LCAC  阅读(93)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示