java8新特性
- 速度更快
- 代码更少(增加了新的语法 Lambda 表达式)?
- 强大的 Stream API
- 便于并行
- 最大化减少空指针异常 Optional
- Nashorn引擎,允许在JVM上运行JS应用
其中最为核心的为Lambda表达式与Stream API
1Lambda简介
Lambda 是一个匿名函数,我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。
函数式编程思想概述
在数学中,函数就是有输入量、输出量的一套计算方案,也就是“拿数据做操作”
面向对象思想强调“必须通过对象的形式来做事情”
函数式思想则尽量忽略面向对象的复杂语法:“强调做什么,而不是以什么形式去做”
Lambda表达式就是函数式思想的体现
1.1从匿名类到Lambda的转换
public static void main(String[] args) {
//匿名内部类
Runnable r1 = new Runnable() {
@Override
public void run() {
System.out.println("匿名内部类线程");
}
};
//Lambda表达式
Runnable r2 = ()->{
System.out.println("Lambda表达式类线程");
};
}
1.2Lambda表达式的标准格式
-
格式: (形式参数) -> {代码块}
-
形式参数:如果有多个参数,参数之间用逗号隔开;如果没有参数,留空即可 -
->:由英文中画线和大于符号组成,固定写法。代表指向动作 -
代码块:是我们具体要做的事情,也就是以前我们写的方法体内容
-
组成Lambda表达式的三要素:
左侧:lambda形参列表 (其实是接口中的抽象方法的形参列表) 右侧:Lambda 体,即 Lambda 表达式要执行的功能(重写的抽象方法的方法体)。
使用前提:
- 使用Lambda必须要有接口
- 并且要求接口中有且仅有一个抽象方法
- 以前用匿名实现类表示的现在都可以用Lambda表达式来写。
2Lambda表达式案例
2.1格式1:无参、无返回值
无参,无返回值,
Lambda
体只需一条语句
public interface Peolpe {
void eat();
}
public class PeopleTest {
//在餐馆吃饭
public static void restaurantEat(Peolpe peolpe){
peolpe.eat();
}
//无参、无返回值 Lambda体只需要一条语句
public static void main(String[] args) {
//普通形式
Peolpe man = new Man();
restaurantEat(man);
//匿名内部类
restaurantEat(new Peolpe() {
@Override
public void eat() {
System.out.println("女人吃饭");
}
});
//Lambda
restaurantEat(()->{
System.out.println("小孩吃饭");
});
}
}
class Man implements Peolpe{
@Override
public void eat() {
System.out.println("男人吃饭");
}
}
2.2格式2:有参、无返回值
public interface MathNumbers {
void sumByNums(int x, int y);//两个数之和
}
public class MathNumbersTest {
public static void main(String[] args) {
queryResults(new MathNumbers() {
@Override
public void sumByNums(int x, int y) {
System.out.println("匿名内部类结果以算出");
}
});
// queryResults((int x, int y)->{
queryResults((x,y)->{//数据类型可以省略 因为可由编译器推断得出,称为“类型推断”
//ArrayList<String> list = new ArrayList<>();//类型推断
//int[] arr = {1,2,3};//类型推断
System.out.println("匿名内部类结果以算出");
});
}
public static void queryResults(MathNumbers mathNumbers){//该方法逻辑不对,只是为了展示lambda语法
System.out.println(1+3);
}
}
2.3格式3:有参、有返回值
public interface MathNumbers {
int sumByNums(int x, int y);//两个数之和
}
public class MathNumbersTest {
public static void main(String[] args) {
queryResults(new MathNumbers() {
@Override
public int sumByNums(int x, int y) {
return x+y;
}
});
// queryResults((int x, int y)->{
queryResults((x,y)->{//数据类型可以省略
return x+y;
});
}
public static void queryResults(MathNumbers mathNumbers){//
}
}
|