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);
}
}
浙公网安备 33010602011771号