编程 | Java8函数式编程入门

Posted IT新青年

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了编程 | Java8函数式编程入门相关的知识,希望对你有一定的参考价值。



       Java 8发布于2014年,距现在已经有4个年头了,被誉为继Java 5以来最具革命性的版本:新增Lambda表达式、引入流式API(Stream API)使Java具有函数式编程的风格、引入Optional类来防止空指针异常、新增接口的默认方法实现关键字default,让实现类默认拥有这个接口的钩子、新增::方法引用等等,在本文中都将一一介绍。



1

目录

1

一、Lambda表达式

1.1、用Lambda表达式代替匿名内部类

1.2、Lambda表达式的参数类型判断

二、Stream API

2.1、Stream API 和 Lambda Expression实现遍历的Demo

2.2、Stream常用方法

2.2.1、 of(T... values)

2.2.2、filter(Predicate<? super T> predicate)

2.2.3、 forEach(Consumer<? super T> action)

2.2.4、map(Function<? super T,? extends R> mapper)

三、default关键字

四、optional类

Part

1

Lambda表达式


1.1、用Lambda表达式代替匿名内部类

       Lambda是希腊字母λ的英文,Lambda表达式允许你通过表达式来代替匿名功能接口实现方法的这一系列繁琐的代码,起到精简结构的作用。


Lambda表达式的语法为:

(parameters) -> expression

(parameters) ->{ statements; }


以下是使用Runnable接口并且重写run方法的一个例子:

编程 | Java8函数式编程入门

      原本我们需要在execute()方法中新建一个Runnable接口并且重写run方法,在使用了Lambda表达式之后,可使用()-> {}代替Runnable接口的重写run方法,达到简化代码的作用。


1.2、Lambda表达式的参数类型判断

       并且在Java 8中,Lambda表达式具有参数类型自动判断:

编程 | Java8函数式编程入门

注意:在使用Lambda表达式去代替匿名接口重写方法时,这个接口有且只有唯一的一个抽象方法,不然Lambda表达式无法判断需要重写哪个方法。



Part

2

Stream API


       流式API是Java 8后引入的重要特性之一,它提供了一套完整的API,配合Lambda表达式使用可以简化代码,使Java代码拥有函数式编程的风格。


2.1、Stream API 和 Lambda Expression实现遍历的Demo


      现在假设我们需要获取List< String >中首字母为a的数据,可以有以下两种写法,我们可以发现使用流式编程和Lambda表达式后会更加地凝练:

获取流-过滤流-遍历流。


编程 | Java8函数式编程入门

2.2、Stream常用方法

       Stream是在Java 8之后更新的一种流,它不同于io流中的InputStream、OutputStream等,准确地说,这个位于java.util下的Stream和io中的流毫无关系。这里的Stream是数据流和对象流。


2.2.1、 of(T… values)

      要把List、Set转化为数据流可以使用xxxList.stream()或者使用Stream.of(T…values),T…values代表着数组或者是不定数量的数据,它们会按顺序转换成数据流。


获得Stream的三种方式

编程 | Java8函数式编程入门


2.2.2、filter(Predicate<? super T> predicate)

       filter用以将流按需过滤成新的流,需要传入的参数为一个位于java.util.function下的Predicate接口并重写test方法去进行校验:

编程 | Java8函数式编程入门

利用Lambda表达式,我们可以将上述代码简化为:

编程 | Java8函数式编程入门

2.2.3、 forEach(Consumer<? super T> action)

       对此流的每一个元素进行操作,需要传入的参数为Consumer接口并且实现其accept方法:

编程 | Java8函数式编程入门

结合Lambda表达式:

编程 | Java8函数式编程入门


2.2.4、map(Function<? super T,? extends R> mapper)

       map方法的作用是对Stream进行处理并且返回一个其他对象充当原Stream。


将数据转换为大写

编程 | Java8函数式编程入门

       需要说明的是,map方法需要传入的参数是一个函数式方法,可以使用lambda表达式也可直接使用双冒号表达式(现在可以将双冒号表达式::理解为对象通过::调用方法并且传入当前的数据作为参数);而collect方法则是将经过map处理的流“收集”起来形成新的流,传递参数Collectors.toList()表示以List的形式转化流。


删除末尾的数字

编程 | Java8函数式编程入门


将Person对象转化为Student对象

编程 | Java8函数式编程入门


Part

3

default关键字


       在Java 8之前,接口中只能定义方法标签,而无法定义方法体,所有的方法体都由实现类去实现,如果需要在实现类中 使用父类的“钩子函数”,那么则需要使用抽象类去代替接口:

编程 | Java8函数式编程入门

而在Java 8中引入了default关键字,能够让接口提供钩子方法:

编程 | Java8函数式编程入门


Part

4

optional类


       Java 8 引入的一个很有趣的特性是 Optional 类。Optional 类主要解决的问题是臭名昭著的NPE(NullPointerException)。


以下就是一个经典的例子:

编程 | Java8函数式编程入门



更多内容,请持续关注IT新青年~

图文/阿荣

排版/云海



以上是关于编程 | Java8函数式编程入门的主要内容,如果未能解决你的问题,请参考以下文章

java8入门必备—函数式编程思维——函数式语言向语言和运行时让渡控制权的途径——柯里化和函数的部分施用

一文带你入门 Java 函数式编程

《Java8实战》读书笔记12:函数式编程

《Java8实战》读书笔记12:函数式编程

java8 函数式编程入门官方文档中文版 java.util.stream 中文版 流处理的相关概念

java函数式编程学习