函数式编程和Stream流常用方法

函数式编程可以帮助我们在大数据量下处理集合时效率更高
高级用法--并行流
优点:
    代码简洁,开发快速
    接近自然语言易于理解
    易于开发编程
-------------Lambda表达式
它可以对某些匿名内部类的写法进行简化。更关注我们对数据进行了什么操作
核心原则:
    可推到可省略
基本格式:
    (参数列表)->{代码}
----
匿名内部类:没有类名的内部类,必须在创建时使用 new 语句来声明类
new  Thread(new Runnable() {//匿名内部类
            public void run() {
                System.out.println("新线程run方法被执行了");
            }
        }).start();
----
 new  Thread(()->{ System.out.println("新线程run方法被执行了"); }).start();//Lambda表达式优化
alt+回车直接转换为Lambda表达式
或者转换为匿名内部类   转的都是接口  
在匿名内部类里重写这个apply方法
 typeConver(new Function<String, Integer>() {
            public Integer apply(String s) {
                return null;
            }
----Stream流
Stream流可以操作数组和集合,并且把里面的数据像流一样操作
不调用终结操作,Stream流不会执行
单列集合 父类是Collection
双列集合 父类是map
map.entrySet 返回值是一个Set集合 泛型是集合当中元素  把map里键和值封装起来的对象就是entry对象
中间操作
filter 可以对流中的元素进行条件过滤,符合过滤条件的才能继续留在流中
map 可以把对流中的元素进行计算或转换
distinct可以去除流中的重复元素
sorted:可以对流中的元素进行排序
limit:可以设置流的最大值,超出的部分将被抛弃
skip:跳过流中的前n个元素,返回剩下的元素
flatMap:map只能把一个对象转换成另一个对象来作为流中的元素。而flatMap可以把一个对象转换成多个对象作为流中的元素
count:可以获取当前流中元素个数
max&min:可以用来获取流中最值
collect:把当前流转换成一个集合
allMath:可以用来判断是否都符合匹配条件结果为boolean类型。都符合结果为true,否则结果为false
noneMatch:可以判断流中的元素是否都不符合匹配条件。如果都不符合结果为true,否则结果为false
findAny:获取流中的任意一个元素。该方法没有办法保证获取的一定是流中的第一个元素
findFirst:获取流中的第一个元素
reduce归并:对流中的数据按照你指定的计算方式计算出一个结果(缩减操作)
reduce的作用是把stream中的元素给组合起来,我们可以传入一个初始值,他会按照我们的计算方式依次拿流中的元素和初始值的基础上进行计算,计算结果再和后面的元素计算
Optiona
Optiona就好像是包装类,可以把我们的具体数据封装Optiona对象内部。然后我们去使用Optiona中封装好的方法操作封装进去的数据就可以避免空指针异常。
一般使用Optional的静态方法ofNullable来把数据封装成一个Optional对象。无论传入的参数是否为null都不会出现问题。

如果你确定一个对象不是空的则可以使用Optional的静态方法of来把数据封装成Optional对象
但一定注意,如果使用of的时候传入的参数必须不为null

orElseGet:获取数据并且设置数据为空时的默认值。如果数据不为空就能获取到该数据。如果为空则根据你传入的参数来创建对象作为默认值返回
orElseThrow:获取数据,如果数据不为空就能获取到该数据。如果为空则根据你传入的参数来创建异常抛出
过滤
可以使用filter方法对数据进行过滤。如果原本是由数据的,但是不符合判断,也会变成一个无数据的Optional对象。
判断
我们可以使用isPresent方法进行是否存在数据的判断。如果为空返回值为false,如果不为空,返回值为true。但是这种方式并不能体现Optional的好处,更推荐使用ifPresent方法。
数据转换
函数式接口
只有一个抽象方法的接口我们称之为函数接口
JDK的函数式接口都加上了@Functionallnterface注解进行标识。但是无论是否加上该注解只要接口中只有一个抽象方法,都是函数式接口。
Consumer消费接口
and:在使用Predicate接口时候可能需要进行判断条件的拼接。而and方法相当于是使用&&来拼接两个判断条件
or:在使用Predicate接口时候可能需要进行判断条件的拼接。而or方法相当于是使用||来拼接两个判断条件
negate:Predicate接口中的方法。negate方法相当于是在判断添加前面加了个!表示取反
我们在重写方法的时候,方法体中只有一行代码,并且这行代码是调用了第一个参数的成员方法,并且我们把要重写的抽象方法中剩余的所有的参数都按照顺序传入了这个成员方法中,这个时候我们就可以引用类的实例方法
我们在重写方法的时候,方法体中只有一行代码,并且这行代码是调用了某个类的构造方法,并且我们把要重写的抽象方法中的所有的参数都按照顺序传入了这个构造方法中,这个时候我们就可以引用构造器
并行流:当流中有大量元素时,我们可以使用并行流去提高操作的效率。其实并行流就是把任务分配给多个线程去完成。使用Styream只需修改一个方法的调用就可以使用并行流来帮我们实现,提高效率。
parallel方法可以把串行流转换成并行流
也可以通过parallelStream直接获取并行流对象。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值