Lambda表达式详解

    Java 8最值得学习的特性就是Lambda表达式。Lambda写的好可以极大减少代码冗余,同时可读性也好过冗长的内部类,匿名类。

举例说明一下:

(1)创建线程传统写法:

		Thread t1=new Thread(new Runnable() {
			@Override
			public void run() {
				System.out.println("hello~");
			}
		});
		t1.start();

lambda表达式写法:

		Thread t2=new Thread(()->System.out.println("hello~lambda"));
		t2.start();

(2)排序传统写法:

		List<String> list=Arrays.asList(new String[]{"b","c","a"});
		Collections.sort(list,new Comparator<String>() {

			@Override
			public int compare(String o1, String o2) {
				return o1.compareTo(o2);
			}
			
		});

lambda写法:

Collections.sort(list,(o1,o2)->o1.compareTo(o2));

    Lambda表达式配合java 8新特性Stream API可以将业务功能通过函数式编程简洁的实现。

lambda表达式的组成:参数列表,箭头,以及一个语句块或者是表达式。

()->{}
(int x,int y)->x+y  //表达式
(int x,int y)->{x+y}; //语句块

()为参数列表,参数的类型可以省略,java编译器可以自动推断。如果只有一个参数且可以被java推断出类型,那么参数列表也可以省略。Lambda表达式的类型叫做“目标类型”,他是一个“函数接口”。(定义:如果一个接口只有一个显式声明的抽象方法,那么它就是一个函数接口,一般用@FunctionalInterface标注出来(也可以不标))。

所以可以用lambda表达式为一个函数接口赋值,比如,Runnable就是一个函数接口,因为它只有一个显式声明的run方法。所以可以用lambda表达式如下:

Runnable r1=()->{System.out.println("hellodake");};

    一个lambda表达式只有在转型成一个函数接口后才能被当作Object使用。所以不能如下使用:

System.out.println(()->{System.out.println();});

必须先将lambda转型如下:

System.out.println((Runnable)()->{System.out.println();});

一个lambda可以有多个目标的类型(函数接口),只要函数匹配成功就行,但至少应该有一个。

所以以下这种情况也是可以的。

Runnable r2=()->{System.out.println("hello");};
MyRunnable r3=()->{System.out.println("dake");};

应用

(1)lambda表达式主要用于替换匿名内部类,各种回调,比如事件响应器,传入Thread类的Runnable等。如:

		Thread t1=new Thread(new Runnable() {
			@Override
			public void run() {
				while(true){
					System.out.println("hello");
				}
			}
		});
		
		Thread t2=new Thread(()->System.out.println());

(2)lambda表达式与集合类批处理操作

未使用lambda表达式的集合迭代操作:

		for(String str:list){
			System.out.println(str);
		}

使用后可以调整为:

list.forEach(str->{System.out.println(str);});

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值