函数式编程/lambda表达式入门
2020-02-25 16:04:03来源:博客园 阅读 ()
函数式编程/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};
函数式编程: 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 发布!
原文链接:https://www.cnblogs.com/askajohnny/p/12361895.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
下一篇:数组 总结笔记
- 因为命名被diss无数次。简单聊聊编程最头疼的事情之一:命名 2020-06-10
- Java3个编程题整理 2020-06-09
- (易忘篇)java基础编程难点4 2020-06-08
- (易忘篇)java基础编程难点3 2020-06-05
- 学习笔记之Lambda表达式 2020-06-05
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash