Lambda 表达式

Lambda表达式可以看做是一个匿名类。将一个Lambda表达式做为参数传递给方法,行为参数化,就实现了函数式编程。
在没有Lambda之前,要实现函数式编程就需要使用匿名类,如果用Lambda会使得代码更加简洁、清晰。

lambda表达式

  • Lambda(其实就是希腊字母λ大写字符为Λ)就是没有名称的代码块,有形式参数列表和实现体
  • 可以作为方法的参数或者赋值给变量
  • 自身没有类型, 编译器会根据环境推断出其类型

例如

(int x,int y)-> {
   return x+y;};
(int x,int y)->{
   int max= x>y ? x: y; return max;};

lambda表达式的语法

(<参数列表>)->(<实现体>)

  • 与方法有所不同:
    • 不能有名称;
    • 不能有返回值类型,其类型由编译器根据环境推断出其类型;
    • 没有throws,由编译器根据环境推断
    • 不能声明参数类型,即参数不能为泛型
    • 可以将其赋值给一个合适的函数式接口变量.
  • 省略参数类型:编译器会根据使用的环境推断出其参数类型.
(int x,int y)-> x+y;
 可以省略为(x,y)->x+y;
 但是不能写成(int x,y)-> x+y;
  • 当只有一个参数时,不仅能省略参数类型,连小括号也能省略
(int x)-> x;
 可以省略为x->x
 但是不允许写为 int x-> x;
  • 没有参数时,小括号不能省略
()->System.out.println("hello");
  • 带修饰符的参数类型不能省略
( final int x,int y)-> x+y; 
  不能写 (x,y)->x+y;
  或者(final x,y)-> x+y;
  • lamda表达式的实现体:
    • 可以是代码块或者表达式
    public class Lambda2 {
   
    public static void main(String[] args) {
   
        // lambda表达式可以复制给一个函数式接口

        Addable sum = (int a, int b) -> {
   
            return a + b;
        };
        Addable q = (a, b) -> a + b;

        Outputable out = () -> {
   
            System.out.println();
        };

        Outputable out3 = () -> 
            System.out.println();
        ;

        //方法引用
        Outputable out2 = System.out::println;

        //有修饰符修饰时,参数类型不能省略
        Finable fin = (final int x, int y) -> x / y;

    }

    private static interface Addable {
   
        int add(int a, int b);
    }

    private static interface Outputable {
   
        void output();
    }

    private static interface Finable {
   
        int divide(final int x, int y);
    }
} 

Lambda 表达式的结构

  • 一个 Lambda 表达式可以有零个或多个参数
  • 参数的类型既可以明确声明,也可以根据上下文来推断。例如:(int a)与(a)效果相同
  • 所有参数需包含在圆括号内,参数之间用逗号相隔。例如:(a, b) 或 (int a, int b) 或 (String a, int b, float c)
  • 空圆括号代表参数集为空。例如:() -> 42
  • 当只有一个参数,且其类型可推导时,圆括号()可省略。例如:a -> return a*a
  • Lambda 表达式的主体可包含零条或多条语句
  • 如果 Lambda 表达式的主体只有一条语句,花括号{}可省略。匿名函数的返回类型与该主体表达式一致
  • 如果 Lambda 表达式的主体包含一条以上语句,则表达式必须包含在花括号{}中(形成代码块)。匿名函数的返回类型与代码块的返回类型一致,若没有返回则为空

referce

1
2

全部评论

相关推荐

点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-27 10:52
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务