函数式编程/lambda表达式入门

函数式编程/lambda表达式入门

本篇主要讲解 lambda表达式的入门,涉及为什么使用函数式编程,以及jdk8提供的函数式接口 和 接口的默认方法 等等

1.什么是命令式编程

命令式编程就是我们去告诉程序如何实现

比如在一堆数字中寻找最小值

    int[] nums = {33, 44, 55, -111, -1};

    int minNum = Integer.MAX_VALUE;

    for (int num : nums) {
        if (num < minNum) {
            minNum = num;
        }
    }

    System.out.println(minNum);

这段代码就是命令式编程,我们去告诉程序如何从一堆数字中找到最小值

1.什么是函数式编程

它不是一种具体的技术,是一种方法论,使用对应提供的函数进行编程,而不是去关心内部的实现

比如在一堆数字中寻找最小值

int[] nums = {33, 44, 55, -111, -1};

int min = IntStream.of(nums).min().getAsInt();
System.out.println(min);

IntStream.of(nums).min() 中就是面向函数式编程,你不需要去实现具体的逻辑,只需要简单调用

2.函数式编程的好处

2.1 易于并发编程 parallel()

比如在一堆数字中寻找最小值

当这堆数字很大的时候,我们需要去实现多线程去比较的话,需要考虑多线程,线程池以及拆分数据,实现快排等。。
但是当我们使用JDK8函数式编程的时候可以直接使用一个方法开启 并行 .parallel()

int min = IntStream.of(nums).parallel().min().getAsInt();

2.2 代码简洁

可以明显看出来函数式编程代码简洁了很多

int[] nums = {33, 44, 55, -111, -1};

 &#x51FD;&#x6570;&#x5F0F;&#x7F16;&#x7A0B;&#xFF1A;   int min = IntStream.of(nums).parallel().min().getAsInt();

 &#x547D;&#x4EE4;&#x5F0F;&#x7F16;&#x7A0B;&#xFF1A;

    int minNum = Integer.MAX_VALUE;

    for (int num : nums) {
        if (num < minNum) {
            minNum = num;
        }
    }

    System.out.println(minNum);

2.3 等等。。。

3.lambda 表达式初接触

在Java中我们创建线程会使用这种方式,弄一个匿名内部类去实现Runnable接口,但是线程执行的核心代码 只是run方法里面的
但是我们需要用这么多行代码去实现,实在不是很友好

    new Thread(new Runnable() {
        @Override
        public void run() {
            System.out.println("lambda &#x521D;&#x8BC6;");
        }
    }).start();

lambda表达式的方式 实现创建一个线程

    new Thread(() -> System.out.println("lambda &#x521D;&#x8BC6;")).start();

可以看出来比上面匿名内部类要简单很多

在Java8中用使用 -> 函数来编写lambda表达式, lambda表达式会返回一个函数

Runnable runnable = () -> System.out.println("lambda &#x521D;&#x8BC6;");

lambda表达式不关心你要实现的是什么接口,只是关心你的入参和返回值 ,如下

interface  MyFunction{
    void hello();
}
 MyFunction myFunction = () -> System.out.println("lambda &#x521D;&#x8BC6;");

4.JDK8中的函数式接口

4.1 概念:

函数式接口是JDK8中引入的概念,对应的注解是 @FunctionalInterface 标注在接口上表示这个接口只有一个方法(不算默认方法) 如下

@FunctionalInterface
interface Interface1 {
   int doubleNumber(int i);
}

4.2 @FunctionalInterface

@FunctionalInterface 这个注解只是起到编译时的检查,不加也行 但是推荐要加上

Interface1 interface1 = (i) -> i * 2;

当我们在标注了@FunctionalInterface这个注解的接口里添加了 2个或者多个方法的时候 会产生编译错误

@FunctionalInterface
interface Interface1 {
  int doubleNumber(int i);
  void someMethod();
}

当我们仔细观察 会发现lambda 表达式只是关注的入参和返回值,也就是说可以把这个lambda表达式赋给任何的有一个参数有一个返回值的函数式接口上

Interface1 interface1 = (i) -> i * 2;

这时候就引入了JDK8提供的默认的函数式接口,大多数情况下就不用我们自己去定义接口了

4.3 默认函数式接口

函数式编程/lambda表达式入门

使用默认的Function函数式接口

Function<integer , integer> function = (i) -> i * 2;
function.apply(10);
</integer>

使用默认的Predicate函数式接口

 Predicate<integer> predicate = (i) -> i % 2 == 0;
 predicate.test(2);
</integer>

5.JDK8接口新特性 默认方法

JKD8接口新特性 默认方法,这个新特性其实是很重要的,它的作用就是在接口上可以定义方法的实现 作为默认方法,这样
Java就可以扩展很多底层接口 比如List接口 ,对其添加了很多default默认方法,这时候List的接口的实现类也不用去修改了

前面有介绍关于@FunctionalInterface 会检测该接口有几个待实现的方法,如果有多个则编译不通过,但是
当我们在另一个方法上面添加 default

@FunctionalInterface
interface Interface1 {
  int doubleNumber(int i);
  void someMethod();
}

-》 如下添加default ,此时接口Interface1 还是保持一个待实现的接口,此时@FunctionalInterface编译就能通过

@FunctionalInterface
interface Interface1 {
  int doubleNumber(int i);

  default void someMethod(){
    System.out.println("Interface1 default Method ");
 }
}

如List提供了 一个sort的default方法,这是以前List接口没有的

函数式编程/lambda表达式入门

6.总结

本篇主要讲解 lambda表达式的入门,涉及函数式编程和命令式编程的区别,以及jdk8提供的函数式接口 和 接口的默认方法 等等该篇只涉及入门概念,具体深入理解还是需要自己去实践,最近准备学习Webflux 所以需要复习一下Java8 lambda 以及 Stream流

个人博客地址: https://www.askajohnny.com 欢迎访问!
本文由博客一文多发平台 OpenWrite 发布!

Original: https://www.cnblogs.com/askajohnny/p/12361895.html
Author: AskaJohnny
Title: 函数式编程/lambda表达式入门

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/685481/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 什么是Servlet?

    Servlet 是sun 公司提供的一门用于开发动态web 资源的技术,是Java 语言中编写Web 服务器扩展功能的重要技术,同时它也是JSP 技术的底层运行基础。 Servle…

    技术杂谈 2023年5月31日
    063
  • C++ 标准库智能指针 unique_ptr 与 shared_ptr

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    技术杂谈 2022年11月23日
    0136
  • ELK收集MySQL慢日志并告警

    采用的是 filebeat采集日志, Redis做日志存储, logstash消费处理日志,将处理过的日志存储到 ES, kibana做日志展示, Elastalert做监控告警长…

    技术杂谈 2023年6月21日
    065
  • Linux进程调度器

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    技术杂谈 2022年12月17日
    0112
  • Android:Jetpack之视图绑定——ViewBinding

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    技术杂谈 2022年12月6日
    0141
  • tarjan全家桶

    tarjan 全家桶 关于tarjan 它太强了 CCCOrz dfs树&low dfs树:在图上做不重复经过同一点的dfs,经过的边与点形成一棵树。于是图上所有点都被这棵…

    技术杂谈 2023年6月21日
    055
  • MySql主要性能指标说明

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    技术杂谈 2022年12月17日
    0127
  • html大文件传输问题

    随着视频网站和大数据应用的普及,特别是高清视频和4K视频应用的到来,超大文件上传已经成为了日常的基础应用需求。 但是在很多情况下,平台运营方并没有大文件上传和断点续传的开发经验,往…

    技术杂谈 2023年5月30日
    050
  • ES6 Template Strings(转)

    Strings in JavaScript have been historically limited, lacking the capabilities one might e…

    技术杂谈 2023年5月30日
    061
  • 数学基础之概率

    本文主要介绍概率与数理统计中的一些常见的基本概念。 对于随机试验,尽管在每次试验之前不能预知试验的结果,但是试验的所有可能结果集合是已知的,我们将随机试验E的所有可能的结果组成的集…

    技术杂谈 2023年5月31日
    053
  • SQL87 最差是第几名(一)

    本题链接表结构如下所示。 +——-+——–+| grade | number |+——-+&#8…

    技术杂谈 2023年7月11日
    068
  • [AWS] Solve Error: Lambda Options Request UnAuthorized

    If you configure CORS (Cross-Origin Resource Sharing) for an API, API Gateway automaticall…

    技术杂谈 2023年5月30日
    076
  • 包机制

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    技术杂谈 2022年11月23日
    0127
  • Jenkins持续集成入门到精通(进阶篇)

    视频参考:https://www.bilibili.com/video/BV1Vp4y1b7ZN?p=51 Jenkins+Docker+SpringCloud持续集成流程说明 大…

    技术杂谈 2023年7月24日
    043
  • PyTorch 介绍 | TENSORS

    Tensor是一种特殊的数据结构,非常类似于数组和矩阵。在PyTorch中,我们使用tensor编码模型的输入和输出,以及模型的参数。 Tensor类似于Numpy的ndarray…

    技术杂谈 2023年7月25日
    042
  • 高仿MT4行情终端(K线图+操控+简单架构)

    注入产生的原理: 数据库设置为GBK编码: 宽字节注入源于程序员设置MySQL连接时错误配置为:set character_set_client=gbk,这样配置会引发编码转换从而…

    技术杂谈 2022年9月30日
    0199
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球