Java函数式编程学习记录


Java函数式编程

函数式编程 vs 面向对象编程

两者的区别

  • 面向对象需要关注用什么对象完成什么事情,
  • 函数式编程主要关注的是对数据进行了什么操作

面向对象编程通过创建对象、定义属性和方法来解决问题,强调对象的状态和行为。而函数式编程通过定义和组合函数来解决问题,强调函数的输入和输出。

Lambda表达式

Lambda表达式的主要功能是可以对某些匿名内部类进行简化。使得代码更加整洁清晰

核心原则

可推导可省略

使用必要条件

匿名内部类必须为接口且只有一个抽象方法需要重写

example1

  • Lambda写法
image-20230710170541192
  • 普通写法
image-20230710170558764

example2

抽象接口IntBinaryOperator的内容如下:

image-20230710173744204
  • 普通写法
image-20230710173437091
  • lambda写法

    image-20230710174008235

省略规则

  • 参数类型可以省略

  • 方法体只有一句时大括号和return和分号可以省略

  • 方法只有一个参数时小括号可以省略

    example
    • 省略前

      image-20230710174311878
    • 省略后

      image-20230710174355840

Stream流

Stream流的作用

大数据量下处理集合效率更高

  • 并行流

  • 消灭嵌套地狱

  • 代码可读性高

数据准备

image-20230710174728779

快速开始

  • 匿名内部类写法

    image-20230710174924258

  • Lambda写法

    image-20230710174941132

创建流

  • 单列集合
    集合对象.Stream()
    
    image-20230710175053030
  • 数组

    Arrays.stream
    
    image-20230710175228482
  • 双列集合

    转为单列集合再创建

    map.entrySet().Stream()
    
    image-20230710175453709
  • 注意事项

    1、惰性求值(如果没有终结操作,没有中间操作是不会得到快行的)
    2、流是一次性的(二旦一个流对像经过一个终结操作后。这个流就不能再被使用)
    3、不会影响原数据(我们在流中可以多数据做很多处理。但是正常情况下是不会影响原来集合

中间操作

  • filter

    可以对流中的元素进行条件过滤,符合条件的继续留在流中

    image-20230710175722633

  • map

    可以把对流中的元素进行计算或转换。

    转换
    image-20230710175843777
    计算
    image-20230710175859855
  • distinct

    可以去除流中的重复元素

    - 注意:distinct方法是依赖Object的equals方法来判断是否是相同对象的。所以需要注意重写equals方法。

    image-20230710180050630

  • sorted

    可以对流中的元素进行排序

    - 返回由该流的元素组成的流,按自然顺序排序。如果此流的元素不是Comparable,则在执行终端操作时可能会抛出 。java.lang.ClassCastException

    image-20230710180100586

  • limit

    限制输出

    image-20230710180112817

  • skip

    跳过元素

    image-20230710180125656

  • flatMap

    map只能把一个对象转换成另一个对象来作为流中的元素。而flatMap可以把一个对象转换成多个对象作为流中的元素。

    image-20230710180145491

终结操作

  • count

    可以用来获取当前流中元素的个数。

    image-20230710180256266

  • max/min

    求最大最小值

    image-20230710180314936

  • collect

    把当前流转换成一个集合。

    image-20230710180410873
  • reduce归并

    对流中的数据按照你指定的计算方式计算出一个结果。

    官方给出的源码格式

    image-20230710180518039

    代码示例

    image-20230710180551732

    reduce的另一种重载方法

    image-20230710181046650

    image-20230710180700950

查找与匹配

  • anyMatch

    可以用来判断是否有任意符合匹配条件的元素,结果为boolean类型。

    image-20230710180718185

  • allMatch

    可以用来判断是否有全部符合匹配条件的元素

  • noneMatch

    可以用来判断是否有全部不符合匹配条件的元素

方法引用

我们在使用ambda时,如果方法体中只有一个方法的调用的话(包括构造方法),我们可以用方法引用进一步简化代码。

基本格式

类名或者对象名::方法名
引用类的静态方法
  • 类名::方法名

    使用前提如果我们在重写方法的时候,方法体中只有一行代码,并目这行代码是调用了某个类的静态方法,并目我们把要重写的抽象方法中所有的参数都按照顺序传入了这个静态方法中,这个时候我们就可以引用类的静态方法。


文章作者: zhang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明来源 zhang !
评论
 上一篇
2023-07-13 zhang
下一篇 
test2 test2
2021-09-12 zhang
  目录