31.1 Java进阶之lambda表达式基本概念,语法

学习总结自《java核心技术卷一》

1.什么是lambda表达式?

lambda表达式是一个可传递的代码块,可以在以后执行一次或多次,也就是说,它能让我们无需新建类就能定义方法并执行,得到我们想要的参数。

其实我们已经接触过lambda表达式了,就是Thread的使用:

public static void main(String[] args) {
    new Thread(()->{
        for(int i=0;i<10;i++){
            System.out.println("hehehe");
        }
    }).start();
}

在这里插入图片描述

其中

()->{
        for(int i=0;i<10;i++){
            System.out.println("hehehe");
        }
    }

这部分就是一个lambda表达式的代码块,他能直接作为参数传入方法中,而不用去建一个类,然后创建类的实例去传入方法中。lambda表达式能让编程更加简洁。

2.为什么要引入lambda表达式?

在引入lambda表达式之前,我们如果想用某一个方法,但这个方法在一个类里,所以我们不得不为了用那一个方法而实例化那个类,这不免让我们感觉有点大材小用。
在有些其他语言中可以直接处理代码块,因为这个特性其他语言在某些方面比java更优秀。
所以Java需要一个功能来实现代码块的传递而不需要新建一个实例的方法,于是lambda表达式被引入java中了。

3.lambda表达式的语法

下面学习lambda表达式的具体使用。

3.1 lambda表达式的表现形式

我们先来看下一个基本的lambda表达式:

(String first,String second)->{
    return first.length()-second.length()
}

从上面看我们可以了解到lambda表达式就是一个代码块,以及必须传入代码的变量规范。
参数->以及一段代码块

3.1.1 如果代码要完成的计算量无法放在一个表达式中,我们就可以像写方法一样把代码放在花括号里

(String first,String second)->{
 if(first.length()<second.length()) return -1;
 else if(first.length()>second.length()) return 1;
 else return 0;
}

实例:

public static void lambdaTest1(){
    String[] strings = new String[4];
    strings[0] = "33123";
    strings[1] = "1";
    strings[2] = "813";
    strings[3] = "1823";
    Arrays.sort(strings,(String first,String second)->{
        if(first.length()<second.length())
            return -1;
        else if(first.length()>second.length())
            return 1;
        else return 0;
    });
    System.out.println(strings[0]);
}

在这里插入图片描述

3.1.2 即使lambda表达式没有参数,前面仍要提供小括号

()->{
    for(int i=100;i>=0;i--) 
        System.out.println(i);
}

例如:

public static void ThreadLambda(){
    new Thread(()->{
        for(int i=100;i>=0;i--)
            System.out.println(i);
    }).start();
}

在这里插入图片描述

3.1.3 如果可以推导出一个lambda表达式的参数类型,我们可以忽略其类型。

Comparator<String> comp = (first, second) ->{
    if(first.length()<second.length())
        return -1;
    else if(first.length()>second.length())
        return 1;
    else return 0;
};

从这里可以看到,lambda表达式其实就是接口方法的快速实现,它能快速实现接口的指定方法而不用去新建类。
例如:

public static void lambdaTest2(){
    Comparator<String> comp = (first, second) ->{
        if(first.length()<second.length())
            return -1;
        else if(first.length()>second.length())
            return 1;
        else return 0;
    };
    String[] strings = new String[4];
    strings[0] = "33123";
    strings[1] = "1";
    strings[2] = "813";
    strings[3] = "1823";
    Arrays.sort(strings,comp);
    System.out.println(strings[0]);
}

在这里插入图片描述

3.1.4 如果方法只有一个参数,而且这个参数的类型可以推导出,我们甚至可以省略小括号。

ActionListener listener = event->System.out.println("Hello");

我们知道有着种写法就行,真实使用还是建议带上()

ActionListener listener = (event)->System.out.println("Hello");

3.1.5 我们无需指定lambda表达式的返回类型。因为lambda表达式的返回类型总是会由上下文推导得出。

(String first,String second)
->first.length()-second.length()

例如:

public static void lambdaTest1(){
    String[] strings = new String[4];
    strings[0] = "33123";
    strings[1] = "1";
    strings[2] = "813";
    strings[3] = "1823";
    Arrays.sort(strings,(String first,String second)->{
        if(first.length()<second.length())
            return -1;
        else if(first.length()>second.length())
            return 1;
        else return 0;
    });
    System.out.println(strings[0]);
}

中的

(String first,String second)->{
        if(first.length()<second.length())
            return -1;
        else if(first.length()>second.length())
            return 1;
        else return 0;
    }

实际上是对

int compare(T o1, T o2);

这个方法是实现,所以知道它的返回类型是int型。

3.1.6 如果一个lambda表达式只在某些分支返回一个值,而在另外一些分支不返回值,这是不合法的。

(int x)->{
  if(x>=0) return 1;
}

例如:

public static void lambdaTest3(){
    Comparator<String> comp = (first, second) ->{
        if(first.length()<second.length())
            return -1;
        else if(first.length()>second.length())
            return 1;
    };
}

在这里插入图片描述

上面的表述没有在x<0时返回值,不严谨,所以是不合法的。
这种情况在代码运行过程中基本不会出现,因为编译器会提示。

4.代码地址

Java基础学习/src/main/java/Progress/exa31_1 · 严家豆/Study - 码云 - 开源中国 (gitee.com)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员小牧之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值