美文网首页
java8 lambda表达式(一)(转载)

java8 lambda表达式(一)(转载)

作者: lconcise | 来源:发表于2018-07-04 19:21 被阅读3次

    原文链接:https://www.cnblogs.com/xiaoxi/p/7008708.html

    一 什么是lambda?

    Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使 Java的语言表达能力得到了提升。

    匿名内部类的写法

    public void demo1(){
        
        Comparator<Integer> comparator = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1, o2);
            }
        };
        
        Runnable runnable = new Runnable() {
            @Override
            public void run() {}
        };
    }
    

    Lambda表达式的写法

    public void demo2(){
        
        Comparator<Integer> comparator = (x,y) -> Integer.compare(x, y);
        
        Runnable runnable = () -> System.out.println("lambda表达式");
    }
    

    二 lambda表达式的语法

    lambda表达式的一般语法:

    (Type1 param1, Type2 param2, ..., TypeN paramN) -> {
      statment1;
      statment2;
      //.............
      return statmentM;
    }
    

    包含三个部分:参数列表,箭头(->),以及一个表达式或语句块。

    1.一个括号内用逗号分隔的形式参数,参数是函数式接口里面方法的参数

    2.一个箭头符号:->

    3.方法体,可以是表达式和代码块,方法体是函数式接口里面方法的实现,如果是代码块,则必须用{}来包裹起来,且需要一个return 返回值,但有个例外,若函数式接口里面方法返回值是void,则无需{}。
    总体看起来像这样:

    (parameters) -> expression 或者 (parameters) -> { statements; }
    

    上面的lambda表达式语法可以认为是最全的版本,写起来还是稍稍有些繁琐。别着急,下面陆续介绍一下lambda表达式的各种简化版:

    1. 参数类型省略–绝大多数情况,编译器都可以从上下文环境中推断出lambda表达式的参数类型。这样lambda表达式就变成了:
    (param1,param2, ..., paramN) -> {
      statment1;
      statment2;
      //.............
      return statmentM;
    }
    
    1. 单参数语法:当lambda表达式的参数个数只有一个,可以省略小括号。lambda表达式简写为:
    param1 -> {
      statment1;
      statment2;
      //.............
      return statmentM;
    }
    
    1. 单语句写法:当lambda表达式只包含一条语句时,可以省略大括号、return和语句结尾的分号。lambda表达式简化为:
    param1 -> statment
    

    下面看几个例子:
    demo1:无参,无返回值,Lambda 体只需一条语句

    Runnable runnable = () -> System.out.println("lamda表达式");
    

    demo2:Lambda 只需要一个参数

    Consumer<String> consumer=(x)->System.out.println(x);
    

    demo3:Lambda 只需要一个参数时,参数的小括号可以省略

    Consumer<String> consumer=x->System.out.println(x);
    

    demo4:Lambda 需要两个参数

    Comparator<Integer> comparator = (x, y) -> Integer.compare(x, y);
    

    demo5:当 Lambda 体只有一条语句时,return 与大括号可以省略

    BinaryOperator<Integer> binaryOperator=(x,y)->(x+y);
    

    demo6:数据类型可以省略,因为可由编译器推断得出,称为“类型推断”

    BinaryOperator<Integer> bo=(x,y)->{
    System.out.println("Lambda");
    return x+y;};
    

    类型推断
    上述 Lambda 表达式中的参数类型都是由编译器推断得出的。Lambda 表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序的上下文,在后台推断出了参数的类型。Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的。这就是所谓的 “类型推断”。

    相关文章

      网友评论

          本文标题:java8 lambda表达式(一)(转载)

          本文链接:https://www.haomeiwen.com/subject/vhqyuftx.html