哈?Lambda表达式竟然这么简单

哈?Lambda表达式竟然这么简单

lambda表达式采用一种简洁的语法定义代码块
那我们应该如何编写lambda表达式呢??

我们先来看一段代码 -> 我们定义一个定时器,希望它每一秒打印当前的时间

首先我们创建一个类实现ActionListener接口,定时器需要调用它的actionPerformed方法

public class Timeing implements ActionListener {
    @Override
    public void actionPerformed(ActionEvent e) {
        System.out.println("时间到啦....MYQ全世界最可爱..."+ new Date());
    }
}

接下来创建定时器对象

public static void main(String[] args) {
        ActionListener listener = new Timeing();
        Timer t = new Timer(10000,listener);  //定时器调用listener  当达到某个时间间隔,定时器就调用ActionListener的actionPerformed方法
        t.start();
}

如果我们要用lambda表达式实现什么的功能该怎么写呢?

public static void main(String[] args) {
		//使用lambda表达式
        Timer t = new Timer(1000,event ->
                System.out.println("The time is" +new Date()));
        t.start();
}

我们无需再去实例ActionListener接口,看是不是简化了代码。

lambda表达式语法

参数 , 箭头 (->) 以及一个表达式

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

//如果我们的代码能够在一个表达式只能执行完成可以这样写
(String first,String second)
	-> first.length() - second.length()
        
//如果lambda表达式没有参数,但是仍然需要空括号
() -> {for(int i=1;i<5;i++) print(i);}

//如果可以推导出一个lambda表达式的参数类型,可以忽略其类型
Compatator<String> comp = (first,second)
	-> first.length() - second.length();

//如果方法只有一个参数,而且这个参数的类型可以推导出来,那么可以省略小括号
ActionListener listener = event -> 
    System.out.print("我好帅啊");

既然讲到了lambda表达式那肯定不能少了 函数式接口

函数式接口

什么是函数式接口?

只有一个抽象方法的接口,当我们需要这种接口的对象时,可以提供一个lambda表达式。这种接口叫做函数式接口

函数式接口必须有一个抽象方法, 如下举例都属于函数式接口

public interface ActionListener { void actionPerformed(ActionEvent e); }

public interface Comparator<T> { int compare(T o1, T o2); boolean equals(Object obj); } 

public interface Runnable { void run(); }

可能有人说Comparator不是有两个抽象方法吗???让我们来看看书中的解释,来自Java核心技术卷I:接口完全有可能重新声明Object类的方法,如toString或xxx,这些声明有可能放方法不再是抽象的。

接下来我们来学习如何将lambda表达式转换为函数式接口 ->

我们用Arrays.sort()方法来演示

    public static <T> void sort(T[] a, Comparator<? super T> c) {
        if (c == null) {
            sort(a);
        } else {
            if (LegacyMergeSort.userRequested)
                legacyMergeSort(a, c);
            else
                TimSort.sort(a, 0, a.length, c, null, 0, 0);
        }
    }

它的第二个参数需要一个Comparator实例,在上面我们也看到了Comparator就是只有一个方法的接口,所以我们提供一个lambda表达式

Arrays.sort(strs,
            (first,second) -> first.length()-second.length());

在底层该方法会创建一个实现了Comparator类的对象,在调用compare方法的时候会执行lambda表达式。

变量作用域

lambda表达式有三个部分组成

1)一个代码块

2)参数

3)自由变量的值,这是指非参数而且不在代码中定义的变量

在lambda表达式中,只能引用值不会改变的变量

public static void test(int a,int b){
	Person p = event -> 
    {
        a = "mjw"; //嘻嘻
        System.out.print("MYQ全世界最可爱...");
    }
}

这是一个错误示范,这是不合法滴. 就算是lambda表达式引用的变量在外部发生改变也是不可行滴.

这里有一条规则:lambda表达式中捕获的变量必须实际上是最终变量,这个变量初始化之后就不能再为它赋新值。

同时lambda表达式不能有同名的情况出现

String MYQ = "最可爱";
Person p = MYQ -> {x...x};

这里出现了两个MYQ这是不行滴.

好了讲了这么多对lambda表达式算是有个初步了理解了…后续就需要大量的实际应用来加深理解了…

加油各位老铁!!!

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值