什么是lambda表达式
lambda表达式时java8的提供的一种新的特性,支持Java进行简单的“函数时编程”,它是一个匿名函数。Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda 是一个匿名函数,可以把 Lambda表达式 理解为是一段可以传递的代码 (将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升 ,JDK 也提供了大量的内置函数式接口供我们使用,使得 Lambda 表达式的运用更加方便、高效
- lambda表达式:是一种特殊的匿名内部类,语法更简洁。
- lambda表达式允许将函数作为一个方法的参数(函数作为方法参数传递),将代码像数据一样传递。
- 基本语法:
<函数式接口> <变量名> = (参数1,参数2…){
//方法体
} - lambda引入了新的操作符:->(箭头操作符),->将表达式分成两部分
- 左侧:(参数1,参数2…)表示参数列表
- 右侧:{}内部是方法体
- 注意事项:
- 形参列表的数据类型会走动推断
- 如果形参列表为空,只需保留参数的名称即可
- 如果形参只有一个,()可以省略,只需参数的名称即可
- 如果执行语句只有一句时,且无返回值,{}可以省略,如果返回值,则若想省区{},则必须同时省略return,且执行语句也保证只有一句
- lambda不会生成一个单独的内部类文件
示例:
package com.hong.lambda;
/**
* @Author hongCheng
* @Date 2021/4/25 14:20
* @Version 1.0
*/
public class Test01 {
public static void main(String[] args) {
Runnable runnable = new Runnable() {//匿名内部类对象
//实现接口中的方法
@Override
public void run() {
System.out.println("这是使用匿名内部类的方式");
}
};
Thread thread = new Thread(runnable);//Runnable target
thread.start();//启动线程---》执行run方法
//改进① jdk1.8 里面的方式就一个方式 表达式 ->
//(方法的形成)->{方法体} 必须接口中只有一个抽象方法
Runnable runnable1 = () -> {
System.out.println("这是lambda表达式的是:改进①");
};
Thread thread1 = new Thread(runnable1);
thread1.start();
//改进②
//如果方法体中只有一条语句,那么直接就可以省略{}
Runnable runnable2 = () -> System.out.println("这是lambda表达式的方式:改进②");
Thread thread2 = new Thread(runnable2);
thread2.start();
//改进③
//thread中传递的runnable对象,那么直接可以将表达式放入thread中
Thread thread3 = new Thread(()-> System.out.println("这是lambda表达式的方式:改进③"),"");
thread3.start();
}
}
使用比较器比较
package com.hong.lambda;
import com.sun.org.apache.xalan.internal.xsltc.trax.XSLTCSource;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Comparator;
import java.util.TreeSet;
/**
* @Author hongCheng
* @Date 2021/4/25 15:02
* @Version 1.0
*/
public class TreeSetTest {
public static void main(String[] args) {
TreeSet<String> strings = new TreeSet<>();//TreeSet具有排序功能,通过自然排序
strings.add("java04");
strings.add("java03");
strings.add("java02");
strings.add("java05");
strings.add("java01");
System.out.println(strings);
/*System.out.println("=============比较器比较Comparable=============");
TreeSet<Person> people = new TreeSet<>();
people.add(new Person(1, "红红"));
people.add(new Person(2, "冬冬"));
people.add(new Person(3, "橙子"));
people.add(new Person(4, "杉杉"));
System.out.println(people);*/
System.out.println("===============使用Comparator============");
Comparator<Person> comparator = new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) {
return o1.getId() - o2.getId();
}
};
TreeSet<Person> treeSet = new TreeSet<>(comparator);//Comparator<? super E> comparator:需要自定义排序
treeSet.add(new Person(3, "红红"));
treeSet.add(new Person(1, "冬冬"));
treeSet.add(new Person(4, "橙子"));
treeSet.add(new Person(2, "杉杉"));
System.out.println(treeSet);
System.out.println("=======Comparator改进①=======");
//Comparator 在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法
Comparator<Person> comparator1 = (o1, o2) -> {
return o1.getId() - o2.getId();
};
TreeSet<Person> treeSet1 = new TreeSet<>(comparator1);//Comparator<? super E> comparator:需要自定义排序
treeSet1.add(new Person(3, "红红"));
treeSet1.add(new Person(1, "冬冬"));
treeSet1.add(new Person(4, "橙子"));
treeSet1.add(new Person(2, "杉杉"));
System.out.println(treeSet1);
System.out.println("=====Comparator改进②=====");
Comparator<Person> comparator2 = (o1, o2) -> o1.getId() - o2.getId();
TreeSet<Person> treeSet2 = new TreeSet<>(comparator2);//Comparator<? super E> comparator:需要自定义排序
treeSet2.add(new Person(3, "红红"));
treeSet2.add(new Person(1, "冬冬"));
treeSet2.add(new Person(4, "橙子"));
treeSet2.add(new Person(2, "杉杉"));
System.out.println(treeSet2);
System.out.println("=====Comparator改进③=====");
TreeSet<Person> treeSet3 = new TreeSet<>((o1, o2)-> o1.getId() - o2.getId());//Comparator<? super E> comparator:需要自定义排序
treeSet3.add(new Person(3, "红红"));
treeSet3.add(new Person(1, "冬冬"));
treeSet3.add(new Person(4, "橙子"));
treeSet3.add(new Person(2, "杉杉"));
System.out.println(treeSet3);
}
}
//Comparable:自然比较器 要求类必须实现Comparable接口。如果该类没有实现Comparable接口那么就会报错
//Comparable:在集合内部定义的方法实现的排序
@Data
@NoArgsConstructor
@AllArgsConstructor
class Person {//implements Comparable<Person>
private Integer id;
private String name;
/*//如果两个元素相同返回0 >0表示大
@Override
public int compareTo(Person o) {
System.out.println(this.name+"----->"+o.name);
return 1;
}*/
}