Java基础|Java8 -- Lambda表达式

Java8 – Lambda表达式介绍 Lambda表达式,也可以称为闭包。Lambda允许把函数作为一个方法的参数传递进方法中使用。
Lambda表达式的使用前提是:接口中只能有一个方法,否则编译报错
Multiple non-overriding abstract methods found in interface:在接口中找到多个非重写的抽象方法
完整的Lambda表达式由三部分组成:1. 参数列表 ; 2. 箭头(->) ; 3. 声明语句 (+ 返回语句)

(Type param1, Type param2, ..., TypeN paramN) -> { statment1; statment2; ...; return statmentN; }

【Java基础|Java8 -- Lambda表达式】Lambda 表达式主要用来定义行内执行的方法类型接口,同时,Lambda 表达式免去了使用匿名方法的麻烦,并且给予Java简单但是强大的函数化的编程能力。
1. Lambda表达式的特征
  1. 可选类型声明 :可以不声明参数类型,编译器能够统一识别。(param1, param2, ..., paramN) ->
  2. 单参数可省略参数的圆括号 :一个参数无需圆括号,但多个参数需要使用圆括号。 param1 ->
  3. ** {}中只有一个语句可以省略大括号** :如果方法主体只有一个语句,就可以省略大括号,如果有多个语句,需要使用大括号。(param1, param2, ..., paramN) -> return statement1
  4. 如果{}中只有一个返回值,则可以省略返回关键字 :如果方法主体只有一个表达式返回值则编译器会自动确定返回值,但是大括号需要指明表达式返回一个数值。
2. 简单案例
public class LambdaStudy {/** * 自定义接口IOperation */ interface IOperation {/** * 返回两个数的操作(加减乘除等) * @param x 参数1 * @param y 参数2 * @return 返回操作结果值 */ int operation(int x, int y); String getString(String str); }/** * 字符串操作接口 */ interface StringOperation {/** * 返回字符串 * @param str 参数 * @return 返回一个字符串 */ String getString(String str); }@Test public void testLambda() {//使用类型声明(int)声明 加法 运算-- 可简写为 add = Integer::sum IOperation add = (int x, int y) -> x + y; //不使用类型声明 减法 运算 IOperation subtract = (x, y) -> x - y; //有大括号声明 乘法 运算 IOperation multiply = (x, y) -> { return x * y; }; //不用括号声明 除法 运算 IOperation divide = (x, y) -> x / y; System.out.println("6 + 6 = " + add.operation(6,6)); System.out.println("6 - 6 = " + subtract.operation(6,6)); System.out.println("6 * 6 = " + multiply.operation(6,6)); System.out.println("6 / 6 = " + divide.operation(6,6)); //字符串拼接输出 StringOperation strOperation = str -> "lambda -> " + str; System.out.println(strOperation.getString("hello")); } }

运行结果:
6 + 6 = 12
6 - 6 = 0
6 * 6 = 36
6 / 6 = 1
lambda -> hello
3. Lambda表达式在实际应用中简洁化案例
例如:使用匿名内部类创建线程并运行
new Thread(new Runnable() {@Override public void run() {System.out.println("Thread内部类方法run"); } }).start();

使用lambda表达式来写只需要一行代码就鞥呢完成:
new Thread(() -> System.out.println("lambda方式创建线程")).start();

Lambda使用的是面向函数式编程的思想,一定程度上可以使代码看起来更加简洁。
4. 方法引用类型
Java8 Lambda表达式提供了集中类型的方法应用,主要是以下三种:
方法引用类型 描述 案例
对象::实例方法 将 lambda 的参数当做方法的参数来使用 objectName::instanceMethod
类::静态方法 将 lambda 的参数当做方法的参数使用 ClassName::staticMethod
类::实例方法 将lambda的第一个参数当做方法的调用者,其他的参数作为方法的参数。(注意:开发中尽量少用这种写法,减少后续维护成本) ClassName::instanceMethod
5. 构造函数的使用
5.1 无参构造方法
Supplier createUser1 = User::new; //完整写法 Supplier createUser2 = () -> new User(); //通过get方法获取对象 User user = createUser1.get(); User user = createUser2.get();

5.2 有参构造方法
User类
@Data class User {private String name; private int age; }

//一个参数,如果参数类型没有对应的构造方法则会编译出错:Cannot resolve constructor Function, User> param1 = User::new; //等价于 可以加括号的写法(name) -> 或者再加上对应的类型 (String name) -> Function, User> param1_ = name -> new User(name); User user = param1.apply("strive"); System.out.println(user);

运行结果:
User{name=‘strive’, age=0}
//两个参数的构造方法 BiFunction, Integer, User> param2 = (name, age) -> new User(name, age); //等价于 BiFunction, Integer, User> param2_ = User::new; User user = param2.apply("strive", 21); System.out.println(user);

运行结果:
User{name=‘strive’, age=21}

    推荐阅读