java8新特性之lambda表达式

lambda表达式

内容

Java8 Lambda 表达式

说明

  1. Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。
  2. Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。
  3. 使用 Lambda 表达式可以使代码变的更加简洁紧凑。

语法

(参数) -> 表达式
或
(参数) ->{ 语句块; }

lambda表达式的重要特征

  1. 可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
  2. 可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。
  3. 可选的大括号:如果主体包含了一个语句,就不需要使用大括号。
  4. 可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定表达式返回了一个数值。

lambda表达式实例

简单实例

以代码为例:

//没有声明类型,没有大括号,只有一个表达式----只有一个表达式会根据表达式默认返回,如:a+b返回a+b的结果,System.out.println("无返回")返回类型为void
MathOperation mathOperation1 = (a,b) -> a+b ;
System.out.println(mathOperation1.operation(1,22));

//有声明类型,没有大括号,只有一个表达式
MathOperation mathOperation2 = (int a,int b) -> a-b ;
System.out.println(mathOperation2.operation(1,2));

//没有声明类型,有大括号----有大括号时,不会默认返回,需要指定返回类型,不指定放回类型是void
MathOperation mathOperation3 = (a,b) -> { return a*b; };
System.out.println(mathOperation3.operation(2,5));

//有声明类型,有大括号
MathOperation mathOperation4 = (int a,int b) -> { return a/b; };
System.out.println(mathOperation4.operation(4,3));

//只有一个参数,无大括号,只有一个表达式,返回类型为空----只有一个参数可以省略(),多个参数不能省略
PrintlnNew printlnNew1 = s -> System.out.println(s);
printlnNew1.println("只有一个参数,无大括号,只有一个表达式,返回类型为空----只有一个参数可以省略(),多个参数不能省略");

//有大括号,返回类型为空
PrintlnNew printlnNew2 = (s) -> {
    System.out.println(s);
};
printlnNew2.println("有大括号,返回类型为空");

//无参数时需要()
NoParameter noParameter = () -> System.out.println("无参数时需要()");
noParameter.println();

代码中的接口:

interface MathOperation{
    int operation(int a,int b);
}

interface PrintlnNew{
    void println(String s);
}

interface NoParameter{
    void println();
}

脚本运行结果:
在这里插入图片描述
使用 Lambda 表达式需要注意以下两点:

  1. Lambda 表达式主要用来定义行内执行的方法类型接口,例如,一个简单方法接口。在上面例子中,我们使用各种类型的Lambda表达式来定义MathOperation接口的方法。然后我们定义了sayMessage的执行。
  2. Lambda 表达式免去了使用匿名方法的麻烦,并且给予Java简单但是强大的函数化的编程能力。

变量作用域

  1. lambda 表达式只能引用标记了 final 的外层局部变量,这就是说不能在 lambda 内部修改定义在域外的局部变量,否则会编译错误。
final  String hello = "Hello";
PrintlnNew printlnNew5 = (String str) ->{
    System.out.println(hello+" "+str);
};
printlnNew5.println("boy");
  1. lambda 表达式的局部变量可以不用声明为 final,但是必须不可被后面的代码修改(即隐性的具有 final 的语义)
String hello1 = "Hello";
//前面修改编译也会报错
hello1="Hello2"; //加此处后面lambda表达式会编译出错
PrintlnNew printlnNew6 = str -> System.out.println(hello1 + " " + str);
printlnNew6.println("girl");
//被后面修改编译会报错
hello1="Hello2"; //加此处前面lambda表达式会编译出错

因此在lambda表达式中引用的外部变量是不可被修改的
3. 在lambda表达式中不允许声明一个与外部变量同名的参数或局部变量

String name = "Idris";
//参数与外部变量同名会编译报错
PrintlnNew printlnNew7 = (name)-> System.out.println(name);
//局部变量与外部变量同名会编译报错
PrintlnNew printlnNew8 = () -> {
    String name = "Gane";
    System.out.println(name);
};

文章说明

本系列只为记录学习成果与内容,如有雷同实属无意

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值