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

2018-07-04  本文已影响3人  lconcise

原文链接: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 表达式的类型依赖于上下文环境,是由编译器推断出来的。这就是所谓的 “类型推断”。

上一篇下一篇

猜你喜欢

热点阅读