Java基础之《Lambda表达式》

主要说明:Lambda表达式、函数式接口、双冒号写法

1、语法
(parameters) -> { statements; }

2、说明
左侧:指定了Lambda表达式所需要的所有参数。
右侧:指定了Lambda体,即Lambda表达式所要执行的功能。

3、左侧参数说明
可选类型声明:不需要声明参数类型,编译器可以统一识别参数值。
可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要定义圆括号。

4、右侧参数说明
可选的大括号:如果主体只有一个语句,就可以不需要使用大括号。
可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,大括号需要指定明表达式返回了一个数值。

5、Lambda表达式就是接口里的唯一未实现方法,等价于一个匿名内部类对象

public class LambdaTest {

	//内部类接口
	interface Mathoperation {
		int operation(int a, int b);
		
		/**
		 * 如果有两个方法则报错:The target type of this expression must be a functional interface
		 * functional interface函数式接口只有一个方法
		 */
		//void hello();
	}
	
	public static void main(String[] args) {
		LambdaTest test = new LambdaTest();
		
		Mathoperation add = (a, b) -> a + b ;
		
		Mathoperation sub = (a, b) -> a - b ;
	}
	
}

6、使用Lambda表达式需要注意以下两点
Lambda表达式主要用来定义行内执行的方法类型接口,例如,一个简单方法接口。在上面例子中,我们使用各种类型的Lambda表达式来定义MathOperation接口的方法。
使用Lambda表达式实现接口仅适用于该接口有且只有一个抽象方法
Lambda表达式免去了使用匿名方法的麻烦,并且给予Java简单但是强大的函数化的编程能力。

7、什么是函数式接口?
函数式接口的定义,在java8中,满足下面任意一个条件的接口都是函数式接口:
1)被@FunctionalInterface注释的接口,满足@FunctionalInterface注释的约束
2)没有被@FunctionalInterface注释的接口,但是满足@FunctionalInterface注释的约束

8、@FunctionalInterface注释的约束
1)接口有且只能有个一个抽象方法,只有方法定义,没有方法体
2)在接口中覆写Object类中的public方法,不算是函数式接口的方法

9、 如何将接口里方法的返回值返回出来?

public class LambdaTest {

	//内部类接口
	interface Mathoperation {
		int operation(int a, int b);
		
		/**
		 * 如果有两个方法则报错:The target type of this expression must be a functional interface
		 * functional interface函数式接口只有一个方法
		 */
		//void hello();
	}
	
	public static void main(String[] args) {
		LambdaTest test = new LambdaTest();
		
		Mathoperation add = (a, b) -> a + b ;
		
		Mathoperation sub = (a, b) -> a - b ;
		
		int i = test.operate(1, 2, add);
		
		int j = test.operate(3, 1, sub);
		
		System.out.println(i);
		
		System.out.println(j);
		
	}
	
	private int operate(int a, int b, Mathoperation mathOperation){
	      return mathOperation.operation(a, b);
	   }
}

Lambda表达式返回的是一个函数式接口,实际上Lambda表达式就是这个函数式接口的实现 

Mathoperation add = (a, b) -> a + b ; //相当于是对接口里方法的实现

Java8用Lambda表达式和函数式接口,实现了把接口的方法作为参数传递的功能(函数式编程) 

//需要另一个方法调用这个接口里的方法
private int operate(int a, int b, Mathoperation mathOperation){
          return mathOperation.operation(a, b);
       }

10、java8里的双冒号写法
双冒号写法就是把方法当做参数传到stream内部,使stream的每个元素都传入到该方法里面执行一下
格式为:类名::方法名

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class Test {

	public static void main(String[] args) {
		List<String> lists1 = Arrays.asList("a","b","c");
		
		//不使用双冒号写法
		//forEach只能遍历,不能修改集合里的值
		lists1.forEach(t -> {
			System.out.println(t.toUpperCase());
		});
		
		List<String> lists2 = Arrays.asList("a","b","c");
		
		//使用双冒号写法
		List<String> lists3 = lists2.stream().map(String::toUpperCase).collect(Collectors.toList());
		
		System.out.println(lists3.toString());
	}
}

 参考资料:
https://blog.csdn.net/qq_36372507/article/details/78757811
 

猜你喜欢

转载自blog.csdn.net/csj50/article/details/120055519