Java8 lambda函数式编程学习
原创
©著作权归作者所有:来自51CTO博客作者zhuhuix的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
定义
Lambda基于数学中的λ演算得名,实质上是一种语法糖。由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能。
标准格式
Lambda表达式由三部分组成:
- 1、一些参数:parameters
- 2、一个箭头:->
- 3、一段代码: expression / { statements; }
(parameters) -> expression
或
(parameters) ->{ statements; }
无参数无返回值
/**
* 无参数无返回值--lambda表达式创建新线程输出线程名
*/
public class Demo1 {
public static void main(String[] args) {
new Thread(() -> {
System.out.println(Thread.currentThread().getName());
}
).start();
}
}
有参数有返回值
/**
* lambda有参数有返回值例子
*
* @author zhuhuix
* @date 2020-05-24
*/
public class Person {
//姓名
private String name;
//年龄
private int age;
public Person(){}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
/**
* lambda有参数有返回值例子
*
* @author zhuhuix
* @date 2020-05-24
*/
public class PersonArrays {
public static void main(String[] args) {
//创建Person数组
Person[] personArray = {
new Person("Mike", 20),
new Person("Jack", 21),
new Person("Rose", 19)
};
//使用lambda表达式对数组中的Person对象按年龄升序排序
Arrays.sort(personArray, (Person p1, Person p2) -> {
return p1.getAge() - p2.getAge();
});
//遍历Person数组
for (int i = 0; i < personArray.length; i++) {
System.out.println(personArray[i].toString());
}
}
}
优化省略
1.小括号中参数列表的数据类型,可以省略不写
2.小括号中的参数如果只有一个,那么类型和小括号都可以省略
3.如果大括号中的代码只有一行,无论是否有返回值,都可以省略大括号,return及分号(要省略则三个必须同时省略)
// 优化省略前的代码
Arrays.sort(personArray, (Person p1, Person p2) -> {
return p1.getAge() - p2.getAge();
});
// 优化省略后的代码
Arrays.sort(personArray, (Person p1, Person p2) -> p1.getAge() - p2.getAge());
使用前提
1、使用lambda必须具有接口,且要求接口中有且仅有一个抽象方法(有且仅有一个抽象方法的接口,称为函数式接口)。
无论是jdk内置的Runnable、Comparator接口还是自定义的接口,只有当接口中的抽象方法存在且唯一时,才可以使用lambda.
2、使用lambda必须具有上下文推断。
也就是说方法的参数或局部变量类型必须为lambda对应的接口类型,才能使用lambda作为该接口的实例。