Java8提供了Lambda表达式的使用,简化代码

Lambda表达式:
  1. Java 8 (Java 1.8) 提供的新语法
  2. 相当于一个简化版的 匿名内部类 , 有人也称为 匿名方法
  3. Java 集合提供了 Lambda表达式功能.
  4. 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);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值