• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

Java8 — Lambda表达式

互联网 diligentman 1个月前 (01-24) 19次浏览

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;}

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<User> createUser1 = User::new;
       //完整写法
       Supplier<User> 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<String, User> param1 = User::new;
//等价于 可以加括号的写法(name) -> 或者再加上对应的类型 (String name) ->
Function<String, User> param1_ = name -> new User(name);
User user = param1.apply("strive");
System.out.println(user);

运行结果:

User{name=‘strive’, age=0}

//两个参数的构造方法
BiFunction<String, Integer, User> param2 = (name, age) -> new User(name, age);
//等价于
BiFunction<String, Integer, User> param2_ = User::new;
User user = param2.apply("strive", 21);
System.out.println(user);

运行结果:

User{name=‘strive’, age=21}


程序员灯塔
转载请注明原文链接:Java8 — Lambda表达式
喜欢 (0)