专栏名称: SegmentFault思否
SegmentFault (www.sf.gg)开发者社区,是中国年轻开发者喜爱的极客社区,我们为开发者提供最纯粹的技术交流和分享平台。
目录
相关文章推荐
程序猿  ·  41岁DeepMind天才科学家去世:长期受 ... ·  20 小时前  
程序员小灰  ·  清华大学《DeepSeek学习手册》(全5册) ·  昨天  
程序员小灰  ·  3个令人惊艳的DeepSeek项目,诞生了! ·  昨天  
程序员的那些事  ·  惊!小偷“零元购”后竟向 DeepSeek ... ·  3 天前  
程序员小灰  ·  DeepSeek做AI代写,彻底爆了! ·  4 天前  
51好读  ›  专栏  ›  SegmentFault思否

最近学到的 Lambda 表达式基础知识

SegmentFault思否  · 公众号  · 程序员  · 2019-10-05 10:00

正文


一、Lambda 用法


之前写 Optional 这个类的时候,简单说了一下 Lambda 是怎么用的,这里再跟大家一起回顾一下,Lambda 的语法是这样的:
语法


以 Lambda 语法创建线程和匿名内部类创建线程的区别 (显然代码少了很多!)

public static void main(String[] args{
    // 用匿名内部类的方式来创建线程
    new Thread(new Runnable() {
        @Override
        public void run(
{
            System.out.println("公众号:Java3y---关注我!");
        }
    });

    // 使用Lambda来创建线程
    new Thread(() -> System.out.println("公众号:Java3y---关注我!"));
}

使用 Lambda 表达式,实际就是创建出该接口的实例对象。

返回一个Runnable对象实例


图示:Runnable 接口来举例
以Runnable接口为例


使用 Labmda 表达式需要函数式编程接口,比如在 Runnable 接口上我们可以看到 @FunctionalInterface 注解 (标记着这个接口只有一个抽象方法)

函数式编程接口只有一个抽象方法


1.1 函数式编程接口


从上面的代码例子可以看出,我们使用 Lambda 表达式创建线程的时候,并不关心接口名,方法名,参数名。我们只关注他的参数类型,参数个数,返回值。

JDK 原生就给我们提供了一些函数式编程接口方便我们去使用,下面是一些常用的接口:

常用的函数式编程接口


简单说明一下:

  • 表格中的一元接口表示只有一个入参,二元接口表示有两个入参

以BiFunction为例

常用的函数式接口


Demo:

// Consumer 一个入参,无返回值
Consumer<String> consumer = s-> System.out.println(s);
consumer.accept("Java3y");


// Supplier 无入参,有返回值
Supplier<String> supplier = () -> "Java4y";
String s = supplier.get();
System.out.println(s);

//.....

使用 Lambda 时,要记住的就两点:

  • Lambda 返回的是接口的实例对象

  • 有没有参数、参数有多少个、需不需要有返回值、返回值的类型是什么——选择自己合适的函数式接口


1.2 方法引用


在学 Lambda 的时候,还可能会发现一种比较奇怪的写法,例如下面的代码:

// 方法引用写法
Consumer<String> consumer = System.out::println;
consumer.accept("Java3y");

如果按正常 Lambda 的写法可能是这样的:


// 普通的Lambda写法
Consumer consumer = s -> System.out.println(s);
consumer.accept("Java3y");

显然使用方法引用比普通的 Lambda 表达式又简洁了一些。

如果函数式接口的实现恰好可以通过调用一个方法来实现,那么我们可以使用方法引用

函数式接口的实现恰好可以通过调用一个方法来实现


方法引用又分了几种:

  • 静态方法的方法引用

  • 非静态方法的方法引用

  • 构造函数的方法引用


方法引用 Demo:

public class Demo {
    public static void main(String[] args) {
        // 静态方法引用--通过类名调用
        Consumer consumerStatic = Java3y::MyNameStatic;
        consumerStatic.accept("3y---static");

        //实例方法引用--通过实例调用
        Java3y java3y = new Java3y();
        Consumer consumer = java3y::myName;
        consumer.accept("3y---instance");

        // 构造方法方法引用--无参数
        Supplier supplier = Java3y::new;
        System.out.println(supplier.get());
    }
}

class Java3y {
    // 静态方法
    public static void MyNameStatic(String name) {
        System.out.println(name);
    }

    // 实例方法






请到「今天看啥」查看全文