Java核心技术-Lambda

Day5

Lambda表达式

lambda表达式就是一个代码块以及必须传入代码的变量规范。

lambda表达式就是把一个代码块作为参数,放在参数列表里面进行传递,共这个方法使用。

数学上带参数变量的表达式就成为lambda表达式。

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

(int x)-> {if(x>0) return 1;}//不合法🙅‍

下面展示如何对一个比较器和监听器使用lambda表达式;

package cn.gyk;

import javax.swing.*;
import java.util.Arrays;
import java.util.Date;

/**
 * @author xg
 * @version V1.0
 * @date 2022/5/25 13:51
 */
public class lambdaDemo {
    public static void main(String[] args) {
        var planets = new String[]{"Mercury","Venus","Earth","Mars","Jupiter","Saturn","Uranus","Neptune"};
        System.out.println(Arrays.toString(planets));
        System.out.println("Sorted in dictionary order:");
        Arrays.sort(planets);
        System.out.println(Arrays.toString(planets));
        System.out.println("Sorted by length:");
        Arrays.sort(planets,(first,second)->first.length()-second.length());
        System.out.println(Arrays.toString(planets));

        var timer = new Timer(1000, event-> System.out.println("The time is "+new Date()));
        timer.start();
        JOptionPane.showMessageDialog(null,"Quit program?");
        System.exit(0);
    }
}

//输出结果
[Mercury, Venus, Earth, Mars, Jupiter, Saturn, Uranus, Neptune]
Sorted in dictionary order:
[Earth, Jupiter, Mars, Mercury, Neptune, Saturn, Uranus, Venus]
Sorted by length:
[Mars, Earth, Venus, Saturn, Uranus, Jupiter, Mercury, Neptune]
The time is Wed May 25 13:58:36 CST 2022
The time is Wed May 25 13:58:37 CST 2022
The time is Wed May 25 13:58:38 CST 2022
The time is Wed May 25 13:58:39 CST 2022
The time is Wed May 25 13:58:40 CST 2022
The time is Wed May 25 13:58:41 CST 2022
The time is Wed May 25 13:58:42 CST 2022

Java中有很多封装代码块的接口,例如ActionListener、Comparator。lambda表达式与这些接口是兼容的。

对于只有一个抽象方法的接口,需要这种借口对象是,就可以提供一个lambda表达式。这种接口叫做函数式接口(functional interface)。

可以把lambda表达式赋值给一个接口类型的变量

//comparator是一个接口
Comparator<String> comp = (first,second)->first.length()-second.length();
//BiFunction是一个接口
//BifFunction<T,U,R>描述了一个类型为T,U,而且返回值类型为R的函数。 
BiFunction<String,String,Integer> comp = (first,second)->first.length()-second.length();

lambda表达式建立一个特定的函数式接口。

java.util.function包中有一个尤其有用的接口Predicate:

public interface Predicate<T>
{
    boolean test(T t);
}

ArrayList类有一个removeIf方法,他的参数就是一个PreDicate接口。这个接口专门用来传递lambda表达式。

list.removeIf(e->e==null);

另一个java.util.supplier例子

供应者实现懒计算。

public class supplier {
    public static void main(String[] args) {
        Student s1 = null;
        Student student = Objects.requireNonNullElseGet(s1,()->new Student("1","1",1));
        System.out.println(student);
    }
}
posted @ 2022-05-25 15:17  破忒头头  阅读(46)  评论(0)    收藏  举报