Maskwang

Talk is nothing,Show me the code

  • 主页
  • 所有文章
  • 随笔
  • 关于我
所有文章 关于我 友链

Maskwang

Talk is nothing,Show me the code

  • 主页
  • 所有文章
  • 随笔
  • 关于我

深入理解Java8Lambada表达式

2018-03-24

  Lambda 表达式是一种匿名函数(对 Java 而言这并不完全正确,但现在姑且这么认为),简单地说,它是没有声明的方法,也即没有访问修饰符、返回值声明和名字。
  你可以将其想做一种速记,在你需要使用某个方法的地方写上它。当某个方法只使用一次,而且定义很简短,使用这种速记替代之尤其有效,这样,你就不必在类中费力写声明与方法了。

Java 中的 Lambda 表达式通常使用 (argument) -> (body) 语法书写,例如:

1
2
(arg1, arg2...) -> { body }
(type1 arg1, type2 arg2...) -> { body }

常见的写法如下

1
2
3
4
5
(int a, int b) -> { return a + b; }
() -> System.out.println("Hello World");
(String s) -> { System.out.println(s); }
() -> 42
() -> { return 3.1415 };

2. 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 表达式的主体包含一条以上语句,则表达式必须包含在花括号{}中(形成代码块)。匿名函数的返回类型与代码块的返回类型一致,若没有返回则为空
3. 函数式接口

  函数式接口是只包含一个抽象方法声明的接口.java.lang.Runnable 就是一种函数式接口,在 Runnable 接口中只声明了一个方法 void run(),相似地,ActionListener 接口也是一种函数式接口,我们使用匿名内部类来实例化函数式接口的对象,有了 Lambda 表达式,这一方式可以得到简化。
每个 Lambda 表达式都能隐式地赋值给函数式接口,例如,我们可以通过 Lambda 表达式创建 Runnable 接口的引用。

1
Runnable r = () -> System.out.println("hello world");

编译器会把lambada表达式当做一个函数来编译.

4. 常见的函数式接口
4.1 Runnable
1
2
3
4
5
6
Runnable runnable = ()->{
System.out.println(Thread.currentThread().getName());
};
Thread thread = new Thread(runnable);
thread.start();
  • Runnable只有一个run函数,且run函数没有参数
    4.2 Consumer接口
    Consumer接口接收一个参数,不返回参数
    1
    2
    3
    4
    5
    6
    7
    public static void consumerFun(int value, Consumer<Integer> c) {
    c.accept(value);
    }
    //调用
    consumerFun(1,(value)->{
    System.out.println(value);
    });
4.3 BinConsumer接口

与Consumer接口一样,只不过接收两个参数,返回0个参数

1
2
3
4
5
6
7
public static void binConsumerFun(String a, String b, BiConsumer<String, String> binc) {
binc.accept(a, b);
}
//调用
binConsumerFun("hello", "maskwang", (a,b)->{
System.out.println(a+b)
});

4.4 Predication

作用接收一个参数,返回一个boolean值

1
2
3
4
5
public static boolean predicateFun(int value, Predicate<Integer> pre) {
return pre.test(value);
}
//调用
System.out.println(predicateFun(3, x->x==3));

4.5 Supplier

作用是接收0个参数,返回一个值

1
2
3
4
5
public static int supplierFun(Supplier<Integer> supplier) {
return supplier.get();
}
//调用
System.out.println(supplierFun(()->1));

4.5 Comparator

lambada表达式实现Comparator

1
2
3
4
5
6
7
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(3);
list.add(2);
list.sort((a,b) -> {return a>b?-1:1;});
//另一种方式
list.forEach(System.out::println)

4.6 集合的操作

实现集合的遍历

1
2
3
4
5
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(3);
list.add(2);
list.forEach((value)->System.out.println(value));

5. Lambda表达式与匿名内部类的联系和区别
联系:
  • lambda表达式创建的对象与匿名内部类生成的对象一样,可以直接调用接口中继承的默认方法。
区别:
  • 匿名内部类可以为任意接口创建实例,不管接口中包含多少个抽象方法,只要在匿名内部类中实现所有抽象方法即可。 但在lambda表达式中只能为函数式接口创建实例。

  • 匿名内部类可以为抽象类甚至普通类创建实例;但lambda表达式只能为函数式接口创建实例。

  • 匿名内部类实现的抽象方法可以允许调用接口中定义默认方法。但lambda表达式的代码块不允许调用接口中定义默认方法。

6. 总结

Lambda 表达式赋予了 Java 相较于其他函数式编程语言缺失的特性,结合虚拟扩展方法之类的特性,Lambda 表达式能写出一些极好的代码。希望能在以后写代码的过程中,把这些用上去,使整个代码看起来很简洁.

ps: ::运算符是方法的引用,用这种方式可以简单代替Lambada

1
2
3
4
String::valueOf x -> String.valueOf(x)
Object::toString x -> x.toString()
x::toString () -> x.toString()
ArrayList::new () -> new ArrayList<>()

参考文章
深入浅出 Java 8 Lambda 表达式
Lambda表达式与匿名内部类的联系和区别

赏

谢谢你请我吃糖果

支付宝
微信
  • Lambada表达式
  • Java基础

扫一扫,分享到微信

微信分享二维码
flink整合kafka实现消费和生产
深入理解HTTPS协议
© 2018 Maskwang
Hexo Theme Yilia by Litten
  • 所有文章
  • 关于我
  • 友链

tag:

  • Cookie&Session
  • HTTP/2
  • 设计模式
  • java
  • HashMap
  • LeetCode
  • Netty
  • netty
  • Springboot
  • Redis
  • websocket
  • springboot
  • web
  • Spring
  • flink
  • kafka
  • 集合
  • Java基础
  • Lambada表达式
  • HTTP
  • Zookeeper
  • 中间件比赛
  • 红黑树

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 友情链接1
  • 友情链接2
  • 友情链接3
  • 友情链接4
  • 友情链接5
  • 友情链接6
很惭愧

只做了一点微小的工作
谢谢大家