函数式编程/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};

 函数式编程:   int min = IntStream.of(nums).parallel().min().getAsInt();

 命令式编程:   

    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 初识");
}
}).start();

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

    new Thread(() -> System.out.println("lambda 初识")).start();

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

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

Runnable runnable = () -> System.out.println("lambda 初识");

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

interface  MyFunction{
void hello();
}
MyFunction myFunction = () -> System.out.println("lambda 初识");

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 默认函数式接口

使用默认的Function函数式接口

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

使用默认的Predicate函数式接口

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

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接口没有的

6.总结

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

个人博客地址: https://www.askajohnny.com 欢迎访问!

本文由博客一文多发平台 OpenWrite 发布!

函数式编程/lambda表达式入门的更多相关文章

  1. 函数式编程--lambda表达式对比匿名内部类

    从前面的整理中我们看出了,Lambda表达式其实是匿名内部类的一种简化,因此它可以部分取代匿名内部类. 1,Lambda表达式与匿名内部类存在如下相同点: 1),Lambda表达式与匿名内部类一样,都 ...

  2. Python函数式编程:从入门到走火入魔

    一行代码显示"爱心" >>> print]+(y*-)**-(x**(y*<= ,)]),-,-)]) Python函数式编程:从入门到走火入魔 # @fi ...

  3. 如何优雅的将文件转换为字符串(环绕执行模式&行为参数化&函数式接口|Lambda表达式)

    首先我们讲几个概念: 环绕执行模式: 简单的讲,就是对于OI,JDBC等类似资源,在用完之后需要关闭的,资源处理时常见的一个模式是打开一个资源,做一些处理,然后关闭资源,这个设置和清理阶段类似,并且会 ...

  4. Java Lambda表达式入门

    Java Lambda表达式入门 http://blog.csdn.net/renfufei/article/details/24600507 Java 8十个lambda表达式案例 http://w ...

  5. boost 的函数式编程库 Phoenix入门学习

    这篇文章是我学习boost phoenix的总结. 序言 Phoenix是一个C++的函数式编程(function programming)库.Phoenix的函数式编程是构建在函数对象上的.因此,了 ...

  6. 函数式编程 -> Lambda

    一.函数式编程 函数式编程,同面向对象编程.指令式编程一样,是一种软件编程范式,在多种编程语言中都有应用.百科词条中有很学术化的解释,但理解起来并不容易.不过,我们可以借助于数学中函数的概念,来理解函 ...

  7. 廖雪峰Java16函数式编程-1Lambda表达式-1Lambda基础

    1. 函数式编程 Java有2类方法: 实例方法:通过实例调用 静态方法:通过类名调用 Java的方法相当于过程式语言的函数 函数式编程(Functional Programing): 把函数作为基本 ...

  8. Lambda表达式入门

    Lambda表达式是Java 8的重要更新,也是一个被广大开发者期待已久的新特性,Lambda表达式支持将代码块作为方法参数,Lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口(这种接 ...

  9. python 函数对象(函数式编程 lambda、map、filter、reduce)、闭包(closure)

    1.函数对象 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 秉承着一切皆对象的理念,我们再次回头来看函数(function).函 ...

随机推荐

  1. Mysql-SQL优化-子查询替代LEFT JOIN

    表A:批次信息表, 表B:实际批次明细表, Mysql版本:5.6.36 两表之间的数据体量差异:表B是表A的10000倍. 经过结转,表B通常保留 1千5百万数据.表A就是1千多条数据. 计算近24 ...

  2. Python Global和Nonlocal的用法

    nonlocal 和 global 也很容易混淆.简单记录下自己的理解. 解释 global 总之一句话,作用域是全局的,就是会修改这个变量对应地址的值. global 语句是一个声明,它适用于整个当 ...

  3. Unity3D游戏开发培训

    Unity3D游戏开发培训 作者:Jesai 时间:2017-01-08 修改:2017-01-09 12:36:15 1         项目的构成 图1-1 如图1-1所示,Unity3D的项目构 ...

  4. MySQL:如何查询出每个分组中的 top n 条记录?

    问题描述 需求: 查询出每月 order_amount(订单金额) 排行前3的记录. 例如对于2019-02,查询结果中就应该是这3条: 解决方法 MySQL 5.7 和 MySQL 8.0 有不同的 ...

  5. 《爬虫学习》(四)(使用lxml,bs4库以及正则表达式解析数据)

    1.XPath: XPath(XML Path Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历. 工具:扩展商店里搜索:XPath ...

  6. jenkins 集成jmeter-简单篇

    测试用例上传至gitlab后,使用jenkins集成gitlab,并执行压测命令 执行完成后,可在jenkins中查看压测报告不同的项目创建最好创建不同的project) [集成]安装&配置& ...

  7. php编译完php.ini加载问题-Loaded Configuration File (none)

    编译安装php7时指定了--with-config-file-path=/usr/local/php7/etc,修改了 php.ini 的配置后重启,但就是不生效. 出现Loaded Configur ...

  8. python 3 创建虚拟环境(Win10)

    python 3 创建虚拟环境(Win10) ①为什么要用虚拟环境? 为了解决一个环境多个项目的版本冲突问题 ②如何创建虚拟环境? 用窗口键+R来打开win10的运行窗口,然后在运行输入框输入cmd, ...

  9. Docker获取镜像报错docker: Error response from daemon

    docker: Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled ...

  10. HTTP核心模块(HTTP Core)

    alias 语法:alias file-path|directory-path;默认值:no使用字段:location这个指令指定一个路径使用某个某个,注意它可能类似于root,但是document ...