Lambda和Stream流
1 jdk8 新特性
-
Lambda和Stream流
-
hashmap 数组、链表、红黑树
-
JVM 元空间代替了永久代
一 lambda表达式
1 函数式接口
函数式接口在Java中是指:有且仅有一个抽象方法的接口。
函数式接口,即适用于函数式编程场景的接口。而Java中的函数式编程体现就是Lambda,所以函数式接口就是可 以适用于Lambda使用的接口。只有确保接口中有且仅有一个抽象方法,Java中的Lambda才能顺利地进行推导。
@FunctionalInterface可以放在接口上面,定义一个函数式接口
# 语法糖
备注:“语法糖”是指使用更加方便,但是原理不变的代码语法。例如在遍历集合时使用的for-each语法,其实 底层的实现原理仍然是迭代器,这便是“语法糖”。从应用层面来讲,Java中的Lambda可以被当做是匿名内部类的“语法糖”,但是二者在原理上是不同的。
2 语法格式
(o1,o2) -> Integer.compare(o1,o2);
-
->是Lambda操作符或箭头操作符
-
->左边是Lambda形参列表(其实就是接口中的抽象方法的形参列表)
-
->右边是lambda体(Lambda 表达式要执行的功能/重写的接口的方法)
3 代码演示
定义六个接口
public interface ILambdaInterface {
}
//无参无返回值
interface NoReturnNoParam{
void m1();
}
//一个参数无返回值
interface NoReturnOneParam{
void m1(int a);
}
//多个参数无返回值
interface NoReturnParam{
void m1(int a,int b);
}
//无参有返回值
interface ReturnNoParam{
int m1();
}
//一个参数有返回值
interface ReturnOneParam{
int m1(int a);
}
//多个参数有返回值
interface ReturnParam{
int m1(int a ,int b);
}
用lambda表达式实现
public class LambdaTest {
public static void main(String[] args) {
//无参无返回值
NoReturnNoParam noReturnNoParam = () -> {
System.out.println(1);
};
noReturnNoParam.m1();
//一个参数无返回值
NoReturnOneParam noReturnOneParam=(int a) -> {
System.out.println(a);
};
noReturnOneParam.m1(5);
//多个参数无返回值
NoReturnParam noReturnParam =(int a ,int b) ->{
System.out.println(a+b);
} ;
noReturnParam.m1(5,10);
//无参有返回值
ReturnNoParam returnNoParam =() -> {
System.out.println(100);
return 100;
};
System.out.println(returnNoParam.m1());
//一个参数有返回值
ReturnOneParam returnOneParam = (int a) ->{
return a;
};
System.out.println(returnOneParam.m1(10));
//多个参数有返回值
ReturnParam returnParam= (int a, int b)-> {
return a+b;
};
System.out.println(returnParam.m1(10, 90));
}
}
4 简化lambda表达式
-
可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
-
可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
-
可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
-
可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。
简化后:
public class LambdaTest01 {
public static void main(String[] args) {
//lambda表达式简化
NoReturnParam noReturnParam =(int a ,int b) ->{
System.out.println(a+b);
} ;
noReturnParam.m1(5,95);
//不需要声明参数类型,编译器可以统一识别参数值。
NoReturnParam noReturnParam1 =( a , b) ->{
System.out.println(a+b);
} ;
noReturnParam1.m1(5,95);
System.out.println("=====================================");
NoReturnOneParam noReturnOneParam=(int a) -> {
System.out.println(a);
};
noReturnOneParam.m1(5);
//一个参数无需定义圆括号,但多个参数需要定义圆括号。
NoReturnOneParam noReturnOneParam1= a ->{
System.out.println(a);
};
noReturnOneParam1.m1(666);
System.out.println("=======================================");
NoReturnNoParam noReturnNoParam = () -> {
System.out.println(1);
};
noReturnNoParam.m1();
//如果主体包含了一个语句,就不需要使用大括号。
NoReturnNoParam noReturnNoParam1 = ()->System.out.println("lambda");
noReturnNoParam1.m1();
ReturnOneParam returnOneParam = (int a) ->{
return a;
};
System.out.println(returnOneParam.m1(10));
//如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。
ReturnOneParam returnOneParam1 = a -> a;
System.out.println(returnOneParam1.m1(10));
}
}
<