Java函数式编程

1. 函数式编程

概念:在数学中,函数是一个问题的解决方案,这个方案的重点拿什么东西就能做什么事情
对于面向对象的思想来说,我们必须明确要由哪一个类来完成这件事,但是我们的目标不是去明确哪一个类也不是去创建这个类的对象,而是完成这件事。
函数式编程思想与面向对象思想的比较:

new Thread(new Runnable(){
 public void run(){
     //...
 }
}).start();
new Thread(()->{
 //...
}).start();

 

Lambda

使用前提:

  1. 必须要有一个方法,方法的参数中要有接口

  2. 该接口必须是一个函数式接口(有且仅有一个抽象方法的接口)

    注:使用@FunctionalInterface可以校验该接口是否是函数式接口

语法格式:

(形参参数列表)->{重写方法的方法体}

格式说明:

  1. ():表示实现类实现接口后重写抽象方法的参数列表(形参)
  2. ->:表示将()中形参所接收到的数据传递给重写的方法体中
  3. {}:表示重写方法的方法体

Lambda表达式中可以省略的部分:

  1. 参数列表中的类型可以省略
  2. 如果参数列表中的参数只有一个,那么()也可以省略,此时参数的类型必须省略
  3. 如果重写的方法体中只有一条语句
    1. 重写的方法没有返回值,{}也可以省略,此时该语句的;必须省略
    2. 重写的方法有返回值,{}也可以省略,此时return;必须省略
       

常见的函数式接口:

  1. Comsumer:消费型接口

    void accept(T t):是一个用于操作指定类型数据的方法
    
  2. Predicate

    boolean test(T t):是一个用于针对指定类型的数据进行判断的方法
    
  3. Supplier:生产型接口

    T get():是一个用于获取指定类型结果的方法
    
  4. Function<T,R>

    R apply(T t):是一个用于将指定类型的数据转换成另一种指定类型数据的方法,根据指定类型的参数获取指定类型的返回
    

2. Stream流

Stream流是根据Lambda表达式引入的一个新概念,专门用于解决操作集合时的弊端

集合中最常见的操作就是遍历,要遍历集合就需要通过循环来实现,而循环并不是遍历集合的目的只是一种手段,所以我们可以通过Stream流来简化集合的遍历操作。
 

获取Stream流对象:

  1. Collection及其子类可以通过对象名.stream()来获取流对象
  2. 数组可以通过Stream的静态方法of()来获取流对象
     

Stream流的常用方法:

  1. 延迟方法:返回值是Stream对象的方法,可以使用链式写法
  2. 终结方法:返回值不是Stream对象的方法
void forEach(Consumer con):终结方法,用于遍历流中的每个元素
Stream filter(Predicate pre):延迟方法:用于对流中的每个元素进行过滤
long count():终结方法,返回流中元素的个数
Stream limit(long n):延迟方法,获取流中的前n个元素
Stream skip(long n):延迟方法,跳过流中的前几个元素
Stream map(Function f):延迟方法,用于将一个指定类型的流对象转换成另一种类型的流对象

版权声明:本文为zjw1060620998原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。