Java8 新特性Lambda表达式

摘要: Lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替 功能接口

关于名称

lambda表达式所使用的运算符是 - > , 通过下面这个图形演变,你可以知道它为什么叫这个名字。实际上,lambda来源于λ演算
这里写图片描述

为何出现

Lambda是一个匿名函数,我们可以把Lambda表达式理解为一段可以传递的代码。在java8以前,很多语言都支持lambda表达式,Java8是使得这个世界上最流行的编程语言采用函数式编程的一次重大跨越。采用lambda使得java可以传递方法,可以写出更加简洁、更加灵活的代码。

直观体验

Java中的匿名内部类是如何实现的

public void testComparator(){
		Comparator<Integer> comparator = new Comparator<Integer>() {
			@Override
			public int compare(Integer x, Integer y) {
				return Integer.compare(x, y);
			}
		};
	}

Java8以后,可以使用Lambda来实现相同的功能

public void testComparatorLam(){
		Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
	}

代码相当简洁,且调用的代码不用更改。

语法格式

Java8中引入了新的操作符’->’,称之为箭头操作符。操作符将Lambda表达式分为两个部分:左侧为参数列表,右侧为Lambda体。

序号需求格式说明
1无参数,无返回值() -> System.out.println(“Hello”)
2有一个参数,无返回值(x) -> System.out.println(x)
3有一个参数,无返回值x -> System.out.print(x)参数小括号省略
4有两个参数,多条语句(x, y) -> {code1 ; code2; code3 …}使用大括号
5有一条语句,有返回值(x, y) -> Integer.compare(x, y)省略return
6参数类型可以省略,如果指定,必须全部指定(Integer x, Integer y) -> Integer.compare(x, y)建议省略,利用的是类型推断

下面对每一种语法举例:

package com.training.lambda;

import java.util.Comparator;
import java.util.function.Consumer;

public class Grammar {
	public void testGrammar1_1(){
		Runnable runnable = new Runnable() {
			
			@Override
			public void run() {
				System.out.println("Hello");
			}
		};
	}
	
	public void testGrammar1_2(){
		Runnable r = () -> System.out.println("World");
	}
	
	public void testGrammar2() {
		Consumer con = (x) -> System.out.println(x);
		con.accept("一个参数,无返回值");
	}
	
	public void testGrammar3() {
		Consumer con = x -> System.out.println(x);
		con.accept("一个参数,无返回值,小括号可以省略");
	}
	
	public void testGrammar4(){
		Comparator<Integer> com = (x, y) -> {
			System.out.println("两个参数,多条语句");
			System.out.println("用大括号包起来");
			return Integer.compare(x, y);
		};
	}
	
	public void testGrammar5(){
		Comparator<Integer> com = (x, y) -> Integer.compare(x, y);
	}
	
	public void testGrammar6(){
		Comparator<Integer> com = (Integer x, Integer y) -> Integer.compare(x, y);
	}
}

使用说明

Lambda表达式需要函数式接口的支持,函数式接口是只有一个抽象方法的接口。
java中已经有了一些函数式接口,如java.lang.Runnablejava.util.Comparator,在java8中,新增加了几个函数式接口,如Consumer。
java8提供 @FunctionalInterface作为注解,这个注解是非必须的,只要接口符合函数式接口的标准(即只包含一个方法的接口),虚拟机会自动判断, 但 最好在接口上使用注解@FunctionalInterface进行声明,以免团队的其他人员错误地往接口中添加新的方法。
关于函数式接口,可以参考这里函数式接口.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

cj96248

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值