用上厕所的时间快速学会lambda

本文介绍了Java 8中的Lambda表达式,这是一种简化匿名内部类代码的新语法。Lambda适用于只有一个抽象方法的接口,常与@FunctionalInterface配合使用。文中通过实例展示了Lambda的使用,包括Runnable接口在创建线程中的应用,并详细讲解了Lambda的省略写法,如省略大括号、参数类型等。最后总结了使用Lambda的条件:接口中只有一个抽象方法且被@FunctionalInterface注解。

一.什么是Lambda表达式?

Lambda表达式是JDK1.8开始之后的新技术,是一种代码的新语法。  作用:“**核心目的是为了简化匿名内部类的代码写法**”。

1.Lambda格式:

(匿名内部类被重写方法的形参列表) -> {
           被重写方法的方法体代码。
        }

2.Lambda表达式的使用前提:

     (1)Lambda表达式并不能简化所有匿名内部类的写法。
     (2)Lambda表达式只能简化**接口中只有一个抽象方法的匿名内部类形式。

3.例子:

在java中,可以使用lambda表达式的大多数都会用注解@FunctionalInterface来标识。

@FunctionalInterface
public interface Runnable {

    public abstract void run();
}

在创建线程时,我们使用的Runnable接口中就有这个标识注解,表示这个接口中只有一个抽象方法,且可以使用lambda表达式来进行简化代码。

在创建一个普通线程并开启时,我们常常使用以下代码:

Thread t = new Thread(new Runnable() {
             @Override
             public void run() {
                System.out.println(Thread.currentThread().getName()+":执行~~~");
		   }
 });

意思就是我们通过匿名内部类的方式向线程的构造方法传入了一个Runnable对象。看看这个代码,都有个5,6行了,代码量有点多,让我们看看如何使用lambda表达式来简化这几行代码:

Thread t1 = new Thread(() -> {
                System.out.println(Thread.currentThread().getName()+":执行~~~");
        });

看到上面的变化没,我们在用图解的方式来解释一下:
在这里插入图片描述

  1. 在以前我们创建匿名内部类时,我们都会new一个接口并重写里面的方法,现在当接口只需要重写一个方法后,我们可以省略new接口的过程,只需要在()里面写上需要重写方法的参数列表,然后再{}里面需要重写的方法体,(){} 之间用-> 连接。
  2. 其实lambda就是简化创建一个匿名内部类的代码。

其实在jdk8中有很多被@FuncationalInterface标识的接口,例如Comarator接口
@FunctionalInterface

public interface Comparator<T> {

    int compare(T o1, T o2);

}

当然你还会在Comparator接口中看到很多默认方法,这些对我们使用lambda是无关紧要的,因为我们最重要的是重写该接口中的一个方法。

二lambda表达式的省略写法

(在lamda表达式的基础上继续进行简化)
我们拿集合的forEach方法来举例:
(forEach中需要传入一个实现了Consumer接口的对象,可以查看Consumer接口是一个函数式接口,我们只需要重写其中的accept方法即可)

Collection<String> list=new ArrayList<String>();
list.add("李四");
list.add("张三");
list.add("王五");
list.add("王五");

list.forEach(new Consumer<String>() {
            @Override
            public void accept(String s) {
                System.out.println(s);
            }
        })

//lambda
list.forEach((String s) -> {
                System.out.println(s);
            }
        )

(1)如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写,同时要省略分号!

list.forEach((String s) -> System.out.println(s) )

(2)如果Lambda表达式的方法体代码只有一行代码。可以省略大括号不写。

    此时,如果这行代码是return语句,必须省略return不写,同时也必须省略";"不写

(3)参数类型可以省略不写。

list.forEach((s) -> System.out.println(s) )

(4)如果只有一个参数,参数类型可以省略,同时()也可以省略。

list.forEach(s -> System.out.println(s) )

以上就是lambda的简化方案

三.总结

总之,记住,要使用lambad注解要拥有一下几点:

  1. lambda简化的是内部类代码
  2. 重写的接口中必须只有一个抽象方法,且接口被@FunctionalInterface注解修饰
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值