Недавно выученные лямбда-выражения

Java Java EE

предисловие

Только лысая голова может стать сильнее.

Текст был включен в мой репозиторий GitHub, добро пожаловать, звезда:GitHub.com/Zhongf UC очень…

Средний осенний фестиваль пошел лечь в Шанхае, называемый внешней пляжной картой:

外滩

Потом я узнал о функциональном программировании на Java, разобрался со всеми и учился вместе!

1. Использование лямбды

Когда я писал класс 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---关注我!"));
}

При использовании лямбда-выражения это фактически объект-экземпляр, создающий интерфейс..

返回一个Runnable对象实例

Диаграмма; Runnable интерфейс в качестве примера:

以Runnable接口为例

Использование лямбда-выраженийТребуется функциональный программный интерфейс, например, в интерфейсе Runnable мы можем видеть@FunctionalInterfaceАннотация (отмечающая, что интерфейс имеет только один абстрактный метод)

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

1.1 Функциональный программный интерфейс

Как видно из приведенного выше примера кода, когда мы используем лямбда-выражения для создания потоков,Не заботьтесь об имени интерфейса, имени метода, имени параметра. мыОбратите внимание только на его тип параметра, количество параметров и возвращаемое значение..

JDK изначально предоставляет нам некоторые функциональные интерфейсы программирования, которые мы можем использовать. Ниже приведены некоторые часто используемые интерфейсы:

常用的函数式编程接口

Кратко объясните:

  • Унарный интерфейс в таблице указывает, что есть только один входной параметр, а бинарный интерфейс указывает, что есть два входных параметра.

以BiFunction为例

常用的函数式接口

Демо:

// 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 следует помнить о двух вещах:

  1. Lambda возвращает экземпляр объекта интерфейса
  2. Есть ли параметры, сколько параметров, есть ли возвращаемое значение и каков тип возвращаемого значения---->Выберите свой собственный функциональный интерфейс

1.2 ссылка на метод

Изучая Lambda, вы также можете найти странный способ записи, например следующий код:

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

Если это написано на обычной лямбде, это может выглядеть так:

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

Очевидно, что использование ссылок на методы немного более лаконично, чем обычные лямбда-выражения.

еслиРеализация функционального интерфейса выполняется путем вызова метода, то мы можем использовать ссылки на методы

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

Существует несколько типов ссылок на методы:

  • Ссылка на статический метод
  • Ссылки на методы для нестатических методов
  • Ссылка на метод конструктора

Демонстрация ссылки на метод:

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

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

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

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

    // 实例方法
    public void myName(String name) {
        System.out.println(name);
    }

    // 无参构造方法
    public Java3y() {
    }
}

Результат выглядит следующим образом:

结果

Наконец

Лямбда Хотя код выглядит простым, но если он сложный, то его довольно некрасиво понять.

При изучении Lambda, прежде всего, мы должны знать, какие интерфейсы функционального программирования обычно используются, и каковы различия между этими интерфейсами функционального программирования (количество параметров, тип возвращаемого значения).

Лямбда-выражение возвращаетЭкземпляр объекта интерфейса,еслиРеализация функционального интерфейса выполняется путем вызова метода, то мы можем использовать ссылки на методы вместо лямбда-выражений

Наконец, вот полный пример:

// Supplier是一个无入参带返回的值的函数式编程接口

// () -> new Java3y()这整句Lambda表达式,返回的是Supplier接口的实例。从Lambda表达式可以看出无参数,带返回值
Supplier<Java3y> supplier = () -> new Java3y(); 

// 由于这个“() -> new Java3y()”Lambda表达式可以通过调用一个方法就实现了,那么我们可以优化成方法引用
Supplier<Java3y> supplier2 = Java3y::new;

рад вывестигалантерейные товарыОбщедоступный номер технологии Java:Java3y. В публичном аккаунтеБолее 200 оригинальных статейТехнические статьи, обширные видеоресурсы, красивые карты мозга,Следуйте, чтобы получить его!

转发到朋友圈是对我最大的支持!

Я думаю, что моя статья хорошо написана, нажмитеотличный!