Java-Lambda表达式
Posted ZSYL
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java-Lambda表达式相关的知识,希望对你有一定的参考价值。
定义
把Lambda表达式理解为简洁地表示可传递的匿名函数的一种方式:它没有名称,但它有参数列表、函数主体、返回类型,可能还有一个可以抛出的异常列表。
- 匿名——我们说匿名,是因为它不像普通的方法那样有一个明确的名称:写得少而想得多。
- 函数——我们说它是函数,是因为Lambda函数不像方法那样属于某个特定的类。但和方法一样,Lambda有参数列表、函数主体、返回类型,还可能有可以抛出的异常列表。
- 传递——Lambda表达式可以作为参数传递给方法或存储在变量中。
- 简洁——无需像匿名类那样写很多模板代码。
组成
参数列表——功能中需要的内容,如 类
箭头——箭头 -> 把参数列表与Lambda主体分隔开
Lambda主体——功能。表达式就是Lambda的返回值
应用
示例1
在竞赛中,很多时候需要用到**Arrays.sort()**进行排序,而有时需要自定义排序类型,重写比较器Comparator。
如:按照年龄升序排序
// 首先定义Person类,属性int age
// 定义一个Person数组
Person persons = {new Person("帅",30),
new Person("柳",21),
new Person("娜",20)
};
// 按照年龄进行升序排序,使用比较器
Arrays.sort(persons, new Comparator<Person>(){
@Override
public int compare(Person o1, Person o2) {
return o1.getAge() - o2.getAge();
}
});
// 简化,编译器知道是哪个方法被重写,可以将方法头,全省去,只剩下return
Arrays.sort(persons, (Person o1, Person o2) -> {
return o1.getAge() - o2.getAge();
});
// 更加简化,编译器知道参数的类型,因此省去类型,去掉大括号和return(二者成对去除)
Arrays.sort(persons, (o1, o2) -> o1.getAge() - o2.getAge());
另外在PriorityQueue(优先队列),中默认元素是升序排序,如果元素类型是自定义类型的对象时,可以重写比较器,修改排序类型。
示例2
- 函数式接口: 函数式接口就是只定义一个抽象方法的接口
下面三个接口都是函数式接口:
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
}
@FunctionalInterface
public interface Callable<V>{
V call();
}
public interface PrivilegedAction<T> {
T run();
}
Lambda表达式允许你直接以内联的形式为函数式接口的抽象方法提供实现,并把整个表达式作为函数式接口的实例(具体说来,是函数式接口一个具体实现的实例)。
public class Lambda {
public static void main(String[] args) {
// 创建Runnale接口的实现类,重写Run方法即设置线程任务
// 创建Thread类对象,将实现类对象作为参数传进去,使用start方法,开始run方法
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}).start();
// lambda表达解决冗余问题
new Thread(()->{
System.out.println(Thread.currentThread().getName());
}
).start();
}
}
// 使用StartThread方法,参数使用匿名内部类
startThread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"开启线程");
}
});
// lambda优化,
startThread(()->System.out.println(Thread.currentThread().getName()+"开启线程"));
Java小白的我,只是初步了解lambda表达式,内容欠缺,抱歉。
努力。
加油!!!
以上是关于Java-Lambda表达式的主要内容,如果未能解决你的问题,请参考以下文章