Java Lambda 表达式

前言

1、Lambda 表达式

  • Lambda 表达式:与匿名类概念相比较,Lambda 其实就是匿名方法,这是一种把方法作为参数进行传递的编程思想。Java 会在背后,悄悄的,把这些都还原成匿名类方式。

    1
    h -> h.hp > 100 && h.damage < 50
  • 引入 Lambda 表达式,会使得代码更加紧凑,而不是各种接口和匿名类到处飞。

  • Lambda 表达式虽然带来了代码的简洁,但是也有其局限性。

    • 可读性差,与啰嗦的但是清晰的匿名类代码结构比较起来,Lambda 表达式一旦变得比较长,就难以理解。
    • 不便于调试,很难在 Lambda 表达式中增加调试信息,比如日志。
    • 版本支持,Lambda 表达式在 JDK8 版本中才开始支持,如果系统使用的是以前的版本,考虑系统的稳定性等原因,而不愿意升级,那么就无法使用。
  • Lambda 比较适合用在简短的业务代码中,并不适合用在复杂的系统中,会加大维护成本。

2、方法引用

  • 方法引用

  • 引用静态方法

    1
    2
    3
    filter(heros, h -> TestLambda.testHero(h));     // 在 Lambda 表达式中使用静态方法

    filter(heros, TestLambda::testHero); // 直接引用静态方法
  • 引用对象方法:与引用静态方法很类似,只是传递方法的时候,需要一个对象的存在。

    1
    2
    3
    filter(heros, h -> testLambda.testHero(h));

    filter(heros, testLambda::testHero);
  • 引用容器中的对象的方法

    1
    2
    3
    filter(heros, h -> h.matched());                // Lambda 表达式中调用容器中的对象的 matched 方法

    filter(heros, Hero::matched); // 引用容器中对象的方法
  • 引用构造器

    1
    List list3 = getList(ArrayList::new);

3、聚合操作

  • 聚合操作

    1
    2
    3
    4
    heros
    .stream()
    .filter(h -> h.hp > 100 && h.damage < 50)
    .forEach(h -> System.out.println(h.name));
文章目录
  1. 1. 前言
  2. 2. 1、Lambda 表达式
  3. 3. 2、方法引用
  4. 4. 3、聚合操作
隐藏目录