Lambda表达式:
- Java 8 (Java 1.8) 提供的新语法
- 相当于一个简化版的 匿名内部类 , 有人也称为 匿名方法
- Java 集合提供了 Lambda表达式功能.
- Lambda是功能性接口的简单实现
Java8新特性:
-
使用Lambda实现功能性接口
- Lambda实现自定义的功能接口
- lambda实现Java API中的功能性接口
- 比如/利用Lambda实现 FileFilter接口
-
Java 8 在集合上提供了Lambda表达式遍历. 也称为函数式遍历
Java8提供了forEach方法遍历集合.
Lambda实现自定义的功能接口
当方法参数是一个接口类型的时候,Lambda 可以作为方法参数值使用
public class LambdaDemo01 {
public static void main(String[] args) {
/**
* Lambda 表达式演示
*
*/
//利用匿名内部类"快捷"实现接口
Foo foo = new Foo(){
public double test(int a,double b){
return a+b;
}
};
System.out.println(foo.test(4, 5.6));
//使用Lambda表达式实现功能接口
Foo foo1=(int a, double b)->{return a+b;};
//当语句块只有一行时候,可以省略{}
Foo foo2=(a, b)->a+b;
//测试
System.out.println(foo1.test(5,6.7));
System.out.println(foo2.test(5,6.7));
//在Lambda表达式中使用多行语句
Foo foo3=(a, b)->{a++;b++;return a+b;};
System.out.println(foo3.test(5,6.7));
//使用Lambda 实现Goo接口
Goo goo = b->System.out.println(b);
//调用
goo.test(5.5);
//当方法参数是一个接口类型时候,
//Lambda 可以作为方法参数值使用
Goo goo1=b->System.out.println(b);
demo(goo1);
demo(b->System.out.println(b));//简洁
}
public static void demo(Goo goo){
goo.test(5.5);
}
}
/**
* 功能性接口: 只有一个方法的接口
* Functional功能性 Interface接口
* Java 8 提供了注解, 用于约束接口必须为
* 功能性接口,即只能有一个方法
* 这是一个可选注解, 可以不用!
*/
@FunctionalInterface
interface Foo{
double test(int a, double b);
// void test();
}
interface Goo{
void test(double b);
}
利用Lambda表达式实现Java API中的功能接口
public class LambdaDemo02 {
public static void main(String[] args) {
/**
* 利用Lambda表达式实现Java API中
* 的功能接口
* 实现Runnable接口
*/
Runnable r=()->{System.out.println(
"Hello World");};
Thread t = new Thread(r);
t.start();
//最简洁写法
Thread t1=new Thread(
()->System.out.println(
"Hello World!"));
t1.start();
//利用Lambda实现 FileFilter接口
//FileFilter exeFile=
// (File file)->{
// return file.getName()
// .endsWith(".exe");};
//FileFilter exeFile=
// file->file.getName().endsWith(".exe");
// new File("/home/soft01");
File dir=new File("D:/");
//利用file tilter 列文件夹内容
//File[] files=dir.listFiles(exeFile);
File[] files=dir.listFiles(
file->file.getName().endsWith(".exe"));
for (File f : files) {
System.out.println(f);
}
}
}
Java 8 在集合上提供了Lambda表达式遍历. 也称为函数式遍历
Java8提供了forEach方法遍历集合.
public static void main(String[] args) {
/**
* Java 8 在集合上提供了Lambda表达式
* 遍历. 也称为函数式遍历
*/
List<String> list = new ArrayList<String>();
list.add("java");
list.add("js");
list.add("c");
list.add("c++");
for (String s : list) {
System.out.println(s);
}
//Java 8 提供了forEach 方法
list.forEach(s->System.out.println(s));
}
Lambda与匿名内部类, 最大的区别
是 this 用法不同:
public class LambdaDemo05 {
public static void main(String[] args) {
/*
* Lambda与匿名内部类, 最大的区别
* 是 this 用法不同:
* 1. 在匿名内部类中 this 代表当前
* 匿名内部类的实例
* 2. 在lambda中this代表,外部类的实例
*/
new Demo().hello();
}
}
class Demo{
int n = 5;
public void hello(){
//匿名内部类: this代表当前匿名内部实例
//Demo.this 代表外部类的实例, 一般时候
//可以省略 this 和 Demo.this
Too t1=new Too(){
int b=6;
public void test(int a) {
System.out.println(
a+this.b+Demo.this.n);
}
};
t1.test(8);
//lambda 中的this是外部类对象的引用
// this 就是 Demo.this
Too t2=(a)->{System.out.println(
a+this.n);};
t2.test(5);
}
}
interface Too{
void test(int a);
}