函数式编程02

发布于:2022-12-21 ⋅ 阅读:(552) ⋅ 点赞:(0)

1.Stream流注意事项:

惰性求值就是要求我们写终结操作。

第二个:

显然第一个foreach终结操作后,流就结束了,我们的得重新开始,不然就报错。

 第三个是在正常操作下符合的,不正常操作下:

这种又丑又危险的代码不要写哦

2.Optional 概述

这能让我们写出优雅而安全的代码

 例一:

 空指针异常

 3.Optional的使用

 创建对象

例一:

一个匿名内部类一个lambda

 后面有一个消费的术语,这其实就来自于Consumer这个类,它在Optional的操作中挺重要的。

ifPresent里含有判断是否为空,所以可以安全地输出。

 如果author不是空的:

 那authorOptional里面封装的Value就是返回的author

还有,这里是不是感觉也没有简化和优雅呢?这主要是因为这个getAuthor不太好,下面我们写个直接返回optional对象的:

optiona.empty()

 综上,显然ofNullable()最方便

 源码:

安全的消费值

 消费就是这个:

 安全地获取值

首先不推荐的是get()

源码:

 

 安全的方法:

 

 

下面这个若为空就抛出异常,在spring框架中常常使用。

 过滤

不记得就用匿名内部类然后idea右键后一键生成lambda表达式:

 

 Predicate泛型抽象接口只有唯一的抽象方法,其他都是默认方法default

 判断

数据转换 

 4.函数式接口

定义

常见接口 

Consumer Function Predicate,这些都不用记,我们需要重写的地方,我们右键生成匿名内部类它自己会提示的,记住,不要死记硬背,计算机有那么多东西,有些东西是不值得你去花太多时间的。

 

 常用的默认方法

and

实际上这两个判断条件完全可以写在一个函数体里面会更方便,所以and一般不用在这里,而是用在下面这种自定义的函数里:

例:

 

这个函数的if里面predicate predicate2都要满足,用的时候给这个函数传入两个匿名内部类

 

 或者lambda

 or

 negate

 5.方法引用(了解即可)

 

 语法详解

引用类的静态方法

 

 引用对象的实例方法

 

 引用类的实例方法

 

 ——>

 构造器引用

 

全部优化后:

 

 6.高级用法

基本数据优化

 在这里第二个map:

 age是integer类型的,所以+10时要拆箱成int,然后再包装成integer返回

filter这里的比较也是一样,有开销的。

 优化:

不过你看这些括号传入的类要稍微记一下

 

 并行流

 

 例子

单个线程:

 

 并行:

 加了个parallel后就会有多个线程,比如有三个线程,1-4在第一个线程进入下面的filter reduce,5-6在第二个线程,7-10在第三个线程被操作,从而提高效率(数据流大的情况下)。

调试:

peek是Stream里面的调试方法,中间操作

结果:

 而如果不用并行:

 则全部都是在主线程里面。

 所以parallel可以把串行流转化为并行流

还有一个方法:

 parallelstream直接得到的就是并行流

本文含有隐藏内容,请 开通VIP 后查看