蓝色字体,选择“标星公众号”优质文章,第一时间送达
来自 | 青衣霓裳
链接 | my.oschina.net/u/4006148/blog/3078359
前言
Java 8 发布已经有一段时间了,这次发布的改动比较大,很多人将这次改动与Java5的升级相提并论。Java8其中一个很重要的新特性就是lambda表达式,允许我们将行为传到函数中。想想看,在Java8 之前我们想要将行为传入函数,仅有的选择就是匿名内部类。Java8发布以后,lambda表达式将大量替代匿名内部类的使用,简化代码的同时,更突出了原来匿名内部类中最重要的那部分包含真正逻辑的代码。尤其是对于做数据的同学来说,当习惯使用类似scala之类的函数式编程语言以后,体会将更加深刻。现在我们就来看看Java8中lambda表达式的一些常见写法。
lambda体中调用方法的参数列表和返回值类型,要和函数式接口中抽象方法的参数列表和返回值类型保持一致。
一、替代匿名内部类
lambda表达式用的最多的场合就是替代匿名内部类,实现Runnable接口是匿名内部类的经典例子。lambda表达式的功能相当强大,用->就可以代替整个匿名内部类!
public class Test1{
public static void main(String[] args) {
Runnable runnable = new Runnable {
@Override
public void run {
System.out.println("普通,线程启动");
}
};
runnable.run;
test2;
test3;
test4;
test5;
}
//无参数,无返回值
public static void test2 {
//“->”左边只有一个小括号,表示无参数,右边是Lambda体(就相当于实现了匿名内部类里面的方法了,(即就是一个可用的接口实现类了。))
Runnable runnable = ->System.out.println("Lambda 表达式方式,线程启动");
runnable.run;
}
//有一个参数,并且无返回值
public static void test3 {
//这个e就代表所实现的接口的方法的参数, 欢迎关注订阅号 Web项目聚集地
Consumer consumer = e->System.out.println("Lambda 表达式方式,"+e);
consumer.accept("传入参数");
}
//有两个以上的参数,有返回值,并且 Lambda 体中有多条语句
public static void test4 {
//Lambda 体中有多条语句,记得要用大括号括起来
Comparator com = (x, y) -> {
System.out.println("函数式接口");
return Integer.compare(x, y);
};
int compare = com.compare(100, 244);
System.out.println("有两个以上的参数,有返回值,"+compare);
}
//若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写
public static void test5 {
//Comparator com = (x, y) -> Integer.compare(100, 244);
System.out.println("若 Lambda 体中只有一条语句, return 和 大括号都可以省略不写,"+Integer.compare(100, 244));
}
}
二、Java8四大内置函数式接口
如果使用lambda还要自己写一个接口的话太麻烦,所以Java自己提供了一些接口:
1、Consumer 消费性接口:void accept(T t);
//有一个参数,并且无返回值
public static void test3 {
//这个e就代表所实现的接口的方法的参数,欢迎关注订阅号 Web项目聚集地
Consumer consumer = e->System.out.println("Lambda 表达式方式,"+e);
consumer.accept("传入参数");
}
2、Supplier供给型接口:T get;
public class Test2 {
public static void main(String[] args) {
ArrayList res = getNumList(10,->(int)(Math.random*100));
System.out.println(res);
}
public static ArrayList getNumList(int num, Supplier sup){
ArrayList list = new ArrayList<>;
for (int i = 0; i < num; i++) {
Integer e = sup.get;
list.add(e);
}
return list;
}
}
3、Function 函数式接口:R apply(T t);
public class Test2 {
public static void main(String[] args) {
String newStr = strHandler("abc