lambda表达式的3种写法

lambda表达式:

简单来说,可以看成是对匿名内部类的简写。使用Lambda表达式时,接口必须是函数式接口

基本语法

<函数式接口>  <变量名> = (参数1,参数2...) -> {

                    //方法体

     }

lambda表达式:简化版 

特点说明:

(参数1,参数2…)表示参数列表;->表示连接符;{}内部是方法体
1、=右边的类型会根据左边的函数式接口类型自动推断;
2、如果形参列表为空,只需保留();
3、如果形参只有1个,()可以省略,只需要参数的名称即可;
4、如果执行语句只有1句,且无返回值,{}可以省略,若有返回值,则若想省去{},则必须同时省略return,且执行语句也保证只有1句;
5、形参列表的数据类型会自动推断;
6、lambda不会生成一个单独的内部类文件;
7、lambda表达式若访问了局部变量,则局部变量必须是final的,若是局部变量没有加final关键字,系统会自动添加,此后在修改该局部变量,会报错;

下述是3个案例讲述lambda表达式对匿名内部类的简化

第一种写法:有参数无返回值

package cn.meituan.lambdaHasArgsAndNoReturn;

/**
 * 有参无返回值测试类
 * /**
	 * lambda表达式简化版
	 * 1.参数只需要名字,不需要类型,会自动推断类型
	 * 2.参数只有一个省略小括号,没有参数小括号不能省略
	 * 3.lambda体(方法体)中只有一句话,省略掉{}
	 * 4.lambda体(方法体)中只有一句话,如果是return,{}省略,而且return也要省略。
	 */
public class HasArgsAndNoReturnTest {
	
	public static void main(String[] args) {
		// 1.采用匿名内部类方式 接口代替实现类对象
		MyInterface my = new MyInterface() {
			@Override
			public void sum(int a, int b) {//实例方法(非static修饰)
				// 没有返回值就直接进行输出
				System.out.println(a + b);
			}
		};

		// 2.采用lambda表达式 简化版
		/**
		 * lambda表达式简化版
		 * 1.参数只需要名字,不需要类型,会自动推断类型
		 * 2.参数只有一个省略小括号,没有参数小括号不能省略
		 * 3.lambda体(方法体)中只有一句话,省略掉{}
		 * 4.lambda体(方法体)中只有一句话,如果是return,{}省略,而且return也要省略。
		 */
		
		MyInterface my1 = ( a,  b) -> System.out.println(a + b);
					
		// 调用方法 接口名方法名
		// 非static修饰 对象名(接口对象名).方法名
		my.sum(5, 6);
		my1.sum(5, 6);
	}
}

第二种写法:有参数有返回值

package cn.meituan.lambdaHasArgsAndReturn;

/**
 * 测试类
 * 有参有返回值测试类
 * 
 * @author Mixi
 *
 */
public class HasArgsAndReturnTest {
	public static void main(String[] args) {
		// 1.采用匿名内部类方式  
		MyInterface my1 = new MyInterface() {

			@Override
			public int sum(int a, int b) {
				return a+b;
			}
		};

		// 2.采用lambda表达式:简化版
		MyInterface my2 =(a,b) -> a+b;
					
		//调用方法 接口名方法名
		System.out.println("两个数和为:"+my1.sum(5, 10));		
		System.out.println("两个数和为:"+my2.sum(5, 20));			
	}
}

第三种写法:无参无返回值测试类

package cn.meituan.lambdaNoArgsAndNoReturn;

/**
 * 无参无返回值测试类
 * @author Mixi
 *
 */
public class NoArgsAndNoReturnTest {
	public static void main(String[] args) {
		// 1.采用匿名内部类方式
		MyInterface my = new MyInterface() {

			// 重写抽象父类中的抽象方法
			@Override
			public void speaking() {
				System.out.println("每个人从小就要学说话");
			}
		};
		
		// 2.采用lambda表达式 简化版
		MyInterface my1 = ()-> System.out.println("每个人从小就要动作");
	
		// 调用方法 接口名.方法名
		my.speaking();
		my1.speaking();		
		
		
	}
}

你可能感兴趣的:(JAVA概念,java,eclipse)