JDK1.8新特性之lambda表达式

2014年3月发布,其中提供了很多的新的特性

一:lambda表达式
a. Lambda表达式称之为闭包,他是java8中的非常重要的特性,很多地方都用到此表达式
b. Lambda表达式允许把函数作为一个方法的参数,函数作为参数进行传递到方法中
c. 从而使得代码更加简洁

语法:
(parameters) ->expression代码 (大多数写法)

(parameters) ->{statement代码块}
说明:

  • 可选参数声明:不需要声明参数类型,编译器统一识别参数值
  • 可选参数圆括号:一个参数无需定义圆括号,多个参数需要定义圆括号
  • 可选大括号:如果主体包含了一个语句,就不需要使用大括号
  • 可选返回关键字:如果主体只有一个表达式返回值,则编译器会自动返回返回值
    大括号需要制定明确制定返回了一个数据值
    比如:
    //不需要参数,返回值为5
    ()->5;
    //接受一个参数(推断出是数字类型),返回是参数值的二倍
    X->2*x
    //接受两个参数(推断是数字类型),返回参数的差值
    (x,y) ->x-y
    //接受两个参数,返回参数的差值
    (int x , int y)->x-y
    //接受一个String类型参数,并输出参数的值
    //推断出没有返回值,相当于方法的返回值为void
    (String str)->System.out.print(str)
  • 其实表达式本质就是接口的子实现
  • lambda表达式就是简化匿名内部类的写法
  • 所以lambda的另一个说法就是函数式编程(因为在代码中看不到类了,只看到了方法/函数)

使用lambda表达式需要注意变量的作用域

  • Lambda表达式可以引用外层成员变量,若为final的,则不可以修改,若不是final的,可以修改
  • Lambda表达式的局部变量可以不用声明为final,但是必须不可以被后面的代码修改(即隐式的final特性)
    Lambda表达式不允许声明一个与局部变量同名的参数或局部变量

例一:

  package jdk8.lambda;
  /**
   * 演示lambda表达式
  * 其实表达式本质就是接口的子实现
  * lambda表达式就是简化匿名内部类的写法
  * 所以lambda的另一个说法就是函数式编程(因为在代码中看不到类了,只看到了方法/函数)
	 * @author PC
 	*	
 	*/
	public class Demo1 {
	//内部接口
	interface MathOPeration{
		int operation(int a,int b);
	}
	interface GreetingService{
		void sayMessage(String message);
	}
	//一接口作为函数的参数
	private int operate(int a , int b,MathOPeration mathoperation){
		return mathoperation.operation(a, b);
	}

	public static void main(String[] args) {
		Demo1 demo = new Demo1();
		//java7做法
		int result =demo.operate(1, 2, new MathOPeration() {

			@Override
			public int operation(int a, int b) {
				// TODO Auto-generated method stub
				return a+b;
			}
		});
		System.out.println("result-->"+result);
		//java8
		//带有类型声明的
		//add代表方法
		MathOPeration add = (int a,int b)->a+b;
		//参数不用带有类型声明
		MathOPeration sub =(a,b)->a-b;
		//大括号中的有返回语句
		MathOPeration mul = (int a,int b)->{return a*b;};
		//没有大括号和返回
		MathOPeration div = (a,b)->a/b;
		//输出结果
		System.out.println(demo.operate(1, 2, add));
		System.out.println(demo.operate(1, 2,sub));
		System.out.println(demo.operate(1, 2,mul));
		System.out.println(demo.operate(10, 2,div));
		
		//不用括号方式
		GreetingService service1 = message->System.out.println("hello "+message);
		//用括号
		GreetingService service2 = (message)->System.out.println("hello "+message);
		
		//调用方法,是接口的子实现中的重写的方法
		service1.sayMessage("zhangsan");
		service2.sayMessage("李四");
	}
	}

例二:

package jdk8.lambda;

  public class Demo2 {
	//再类中添加final变量
	static final String hello = "Hello";
	interface GreetingSrevice{
		void sayMessage(String message);
	}
	public static void main(String[] args) {
		GreetingSrevice service1 = (message)->System.out.println(hello+message);
		service1.sayMessage("zhangsan");
	}
	 }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值