Java 函数式编程和Lambda表达式
1、Java 8最重要的新特性
Lambda表达式、接口改进(默认方法)和批数据处理。
2、函数式编程
本质上来说,编程关注两个维度:数据和数据上的操作。
面向对象的编程泛型强调让操作围绕数据,这样可以实现以类为单位的重用,当为类添加新的数据类型时,原有代码无需修改。
函数式编程是一种不同的编程模型,它以操作(函数)为中心,强调变量不变性。函数式编程的准则是不依赖外部的数据,也不改变外部数据的值。这一特性满足了多核并行程序设计的需求,因此能简化并行程序开发。
函数式编程用函数来表达所有的概念,完成所有的操作。面向对象编程中,把对象当作参数传递,而在函数式编程中,函数可以作为其他函数的参数传递,返回值也可以是函数。
从开发者角度看,函数式编程不支持赋值操作,一个函数的执行只会返回一个值or函数,不会有任何副作用,所以看上去,一个函数就是一个大表达式。
3、Lambda表达式使用场合
Lambda表达式实现了函数式编程,能够让开发者将程序代码如同数据一样使用。方法可以被当作参数传递到其他方法内,如同对象实例或数。
使用场合:通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数。
Lambda表达式可以用于替换广泛使用的内部匿名类实现回调功能,用于事件响应器。
4、Lambda表达式语法
Lambda表达式是一个能够作为参数传递的匿名函数对象,它没有名字,有参数列表、函数体、返回类型,也可以抛出异常。它的类型是函数接口(Functional Interface)。
语法:
1) 形式参数:即参数列表,就是函数式接口里方法的参数。
2) 向右的箭头(->):起分割作用。
3) 方法体。表达式或者代码块,是函数式接口中方法的实现。(可以return返回值)
5、什么是函数式接口
函数式接口指仅包含一个抽象方法的接口。
java.lang.Runnable、java.util.Comparator是典型的函数式接口
6、函数式接口和Lambda表达式的联系
Lambda表达式需要一个函数式接口作为其对应类型,而它的方法体就是函数接口的实现。每一个该接口类型的Lambda表达式都会被匹配到该接口的抽象方法。
7、函数式接口的对象怎么创建
- 标准方法创建;
- 使用Lambda表达式创建。(可以简化代码)
/*Lambda表达式创建函数式接口的对象*/
interface Converter{
Integer convert(String from);
}
Converter converter=(from)->Integer.valueOf(from);
Integer integer=converter.convert(“123”);
8、自动类型推到
上面的代码中,编译器知道Converter只有一个方法convert(),所以convert()方法肯定对应表达式(from)->Integer.valueOf(from);
由于convert()只有一个参数,所以from一定是String类型的。
9、方法引用
Lambda表达式到底意味着什么?任何一个Lambda表达式都可以被当作某个函数接口中的唯一抽象方法的匿名描述符。
可以使用某个类的某个具体方法代表这个描述符,即为方法引用。这样,就无须绑定方法引用到某个实例,直接将实例作为功能接口的参数进行传递。
方法的引用通过::符号来实现,方法引用被认为是和Lambda表达式一样的,可用于功能接口所适用的地方。
/*相当于让Converter接口的方法等价于Integer::valueOf()*/
Converter converter=Integer::valueof();
Integer integer=converter.convert(“123”);
10、新特性——接口的默认方法(default)
接口的默认方法是为了解决接口演化问题,即新版本中对接口进行修改,会导致早期版本的代码无法运行。因为接口中的方法必须被实现,若在接口中添加新方法,可能进行大量重构。所以,若往一个接口中添加新的方法,可以提供该方法的默认实现。
有了默认方法,对已有的接口使用者来说,代码可以继续运行。新的代码可以继续使用该方法,也可以重写默认的实现。
interface Formula{
double calculate(int a);
/*新增的方法,提供一个默认实现*/
default double sqrt (int a) {
return Math.sqrt(s);
}
}
Java 函数式编程和Lambda表达式的更多相关文章
- Java 函数式编程(Lambda表达式)与Stream API
1 函数式编程 函数式编程(Functional Programming)是编程范式的一种.最常见的编程范式是命令式编程(Impera Programming),比如面向过程.面向对象编程都属于命令式 ...
- Java函数式编程和lambda表达式
为什么要使用函数式编程 函数式编程更多时候是一种编程的思维方式,是种方法论.函数式与命令式编程的区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉代码要怎么做.说白了,函数式编程是基于 ...
- java函数式编程之lambda表达式
作为比较老牌的面向对象的编程语言java,在对函数式编程的支持上一直不温不火. 认为面向对象式编程就应该纯粹的面向对象,于是经常看到这样的写法:如果你想写一个方法,那么就必须把它放到一个类里面,然后n ...
- Java函数式接口与Lambda表达式
什么是函数式接口? 函数式接口是一种特殊的接口,接口中只有一个抽象方法. 函数式接口与Lambda表达式有什么关系? 当需要一个函数式接口的对象时,可以提供一个lambda表达式. package l ...
- Java8函数式编程和lambda表达式
文章目录函数式编程JDK8接口新特性函数接口方法引用函数式编程函数式编程更多时候是一种编程的思维方式,是一种方法论.函数式与命令式编程区别主要在于:函数式编程是告诉代码你要做什么,而命令式编程则是告诉 ...
- Java8函数式编程以及Lambda表达式
第一章 认识Java8以及函数式编程 尽管距离Java8发布已经过去7.8年的时间,但时至今日仍然有许多公司.项目停留在Java7甚至更早的版本.即使已经开始使用Java8的项目,大多数程序员也仍然采 ...
- Python函数式编程:Lambda表达式
首先我们要明白在编程语言中,表达式和语句的区别. 表达式是一个由变量.常量.有返回值的函数加运算符组成的一个式子,该式子是有返回值的 ,如 a + 1 就是个表达式, 单独的一个常量.变量 或函数调 ...
- C# 函数式编程 —— 使用 Lambda 表达式编写递归函数
最近看了赵姐夫的这篇博客http://blog.zhaojie.me/2009/08/recursive-lambda-expressions.html,主要讲的是如何使用 Lambda 编写递归函数 ...
- 函数式编程--使用lambda表达式
前面一篇博客我们已经说到了,lambda表达式允许使用更简洁的代码来创建只有一个抽象方法的接口的实例.现在我们来写一段java的命令者模式来自己研究下lambda表达式的语法. 这里重复下命令者模式: ...
随机推荐
- windows内核代码之进程操作
[toc] 一丶简介 整理一下windows内核中.常用的代码.这里只整理下进程的相关代码. 二丶 windows内核之遍历进程 内核中记录进程的结构体是EPROCESS结构.所以只需要遍历这个结构即 ...
- 修改Docker容器启动配置参数
有时候,我们创建容器时忘了添加参数 --restart=always ,当 Docker 重启时,容器未能自动启动, 现在要添加该参数怎么办呢,方法有二: 1.Docker 命令修改 docker c ...
- IIS基本设置、回收机制、性能、并发、安全性
通常把站点发布到IIS上运行正常后,很少会去考虑IIS提供的各种参数,如何配置才是最适合当前站点运行需要的?这篇文章,从基本设置.回收机制.性能.并发.安全性等IIS设置讲解应当如何优化. 先来“II ...
- Mybatis的if标签判断空字符串 == 0,参数为0时会自动转为空字符串
对于这个问题,有两种解决办法. 1.当传入的参数有0时,只判断!=null即可. 2.将0转化为String类型,就可以解决这个问题.
- web项目脱敏白名单管理
写在前面 下午没事, 看一下同事写的脱敏白名单管理功能. 所谓的脱敏就是将页面中查询出的信息列表当中的身份证号及手机号等关键信息部分用*号代替.该功能主要思路是新增一个页面用于配置哪些页面以及页面中哪 ...
- docker jenkins 插件安装提速
公司安装的jenkins 自动布署服务挂了,好像有漏洞一直搞,打算重新安装一个,随便再学习一下 一上来就用docker 解决问题 #!/bin/bash docker stop myjenkins d ...
- str.replace替换变量名的字符串
网易云课堂该课程链接地址 https://study.163.com/course/courseMain.htm?share=2&shareId=400000000398149&cou ...
- 【GMT43智能液晶模块】例程十四:MODBUS TCP实验——电源监控
. 源代码下载链接: 链接:https://pan.baidu.com/s/1S8wZBJBYGxuPaWEkJvMJlg 提取码:5bh3 复制这段内容后打开百度网盘手机App,操作更方便哦 GMT ...
- vscode-tab按键失效变为切换功能的解决方法
有一种可能是无意中按到了ctrl+m,此时VSCode右下角会出现Tab Moves focus的字样,如下: 用ctrl + m 可以切换两种状态.没有Tab Moves focus字样的时候,就是 ...
- EasyDSS高性能RTMP、HLS(m3u8)、HTTP-FLV、RTSP流媒体服务器解决方案之CDN内容分发网络
背景分析 EasyDSS流媒体解决方案提供一站式的转码.点播.直播.录像.检索.时移回放服务,极大地简化了开发和集成的工作,并且EasyDSS支持多种特性,完全能够满足企业视频信息化建设方面的需求.其 ...