概述
- Java8 (又称 JKD1.8) 是 Java 语言开发的一个主要版本。
- Oracle公司于2014年3月18日发布Java8 。
- 支持Lambda表达式
- 函数式接口
- 新的Stream API
- 新的日期 API
- 其他特性
Lambda表达式
概述
- Lambda表达式是特殊的匿名内部类,语法更简洁。
- Lambda表达式允许把函数作为一个方法的参数(函数作为方法参数传递),将代码像数据一样传递。
- 基本优化如下:
//1,创建匿名内部类
Runnable runnable1 = new Runnable() {
@Override
public void run() {
}
};
//2,lambd的优化
Runnable runnable2 = () -> {
System.out.println("启动了一个线程");
};片
使用规则
- Lambda表达式主要针对的是接口
- 接口中只有一个抽象方法,为了监测是否可以使用lambda表达式,可以使用@FunctionalInterface会检测当前接口是否可以使用lambda表达式
@FunctionalInterface
public interface Father {
public void say();
//public void get();
}
Lambda参数的使用
- 创建一个带参数的方法接口
@FunctionalInterface
public interface Father2 {
public void say(String name,int age);
}
使用lambda表达式的代码实现
/*
Father2 father2 = new Father2() {
@Override
public void say(String name, int age) {
}
};
*/
//lambda表达式传递的是形参
Father2 father2 = (name, age) -> {
System.out.println("我的名字是"+name+",年龄:"+age);
};
//通过接口调用方法的时候是实参
father2.say("小明",15);
lambda表达式的返回值
- 定义带返回参数的接口方法
public interface Father3 {
int plus(int a,int b);
}
lambda表达式的调用
/*
Father3 father3 = new Father3() {
@Override
public int plus(int a, int b) {
return a+b;
}
};*/
Father3 father4 = (a, b) -> {
System.out.println("aa");
return a+b;
};
//如果只有一行代码可以省略return和{}
Father3 father3 = (a, b) -> a+b;
应用场景
遍历集合的lambda表达式的应用
List<String> list= new ArrayList<>();
for (int i=0;i<10;i++){
list.add("a"+i);
}
//常规用法
list.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
System.out.println(s);
}
});
//使用lambda表达式进行遍历
list.forEach(s->{
System.out.println(s);
});
使用了lambda表达式之后,this的性质会发生变化
int a;
public void test(){
List<String> list= new ArrayList<>();
//使用lambda表达式进行遍历
list.forEach(new Consumer<String>() {
@Override
public void accept(String s) {
//this代表的是 new Consumer()对象
}
});
list.forEach(s -> {
//如果使用了lambda表达式,
// this代表当前方法所在的对象
this.a = 5;
});
}