предисловие
Только лысая голова может стать сильнее.
Текст был включен в мой репозиторий 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 мы можем видеть@FunctionalInterface
Аннотация (отмечающая, что интерфейс имеет только один абстрактный метод)
1.1 Функциональный программный интерфейс
Как видно из приведенного выше примера кода, когда мы используем лямбда-выражения для создания потоков,Не заботьтесь об имени интерфейса, имени метода, имени параметра. мыОбратите внимание только на его тип параметра, количество параметров и возвращаемое значение..
JDK изначально предоставляет нам некоторые функциональные интерфейсы программирования, которые мы можем использовать. Ниже приведены некоторые часто используемые интерфейсы:
Кратко объясните:
- Унарный интерфейс в таблице указывает, что есть только один входной параметр, а бинарный интерфейс указывает, что есть два входных параметра.
Демо:
// 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写法
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 оригинальных статейТехнические статьи, обширные видеоресурсы, красивые карты мозга,Следуйте, чтобы получить его!
Я думаю, что моя статья хорошо написана, нажмитеотличный!