Java 8 新特性:函数式编程

Java 8 新特性:函数式编程

一、是什么?

首先需要清楚一个概念:函数式接口;

它指的是有且只有一个未实现的方法的接口,一般通过FunctionalInterface这个注解来表明某个接口是一个函数式接口。

函数式接口是Java支持函数式编程的基础。

Java8新引入函数式编程方式,大大的提高了编码效率。

二、有哪些Java函数式接口(最基本)?

1、Consumer(BiConsumer)

Consumer是一个函数式编程接口;

顾名思义,Consumer的意思就是消费,即针对某个东西我们来使用它,因此它包含有一个有输入而无

输出的accept接口方法;

除accept方法,它还包含有andThen这个方法;

2、Function(BiFunction)

Function也是一个函数式编程接口;

它代表的含义是“函数”,而函数经常是有输入输出的,因此它含有一个apply方法,包含一个输入与一个

输出;

除apply方法外,它还有compose与andThen及indentity三个方法;

3、Predicate

Predicate为函数式接口;

predicate的中文意思是“断定”,即判断的意思,判断某个东西是否满足某种条件; 因此它包含test方

法,根据输入值来做逻辑判断,其结果为True或者False。

4、Supplier

Supplier也是一个为函数式接口;

它代表的含义是“供应”,它含有一个get方法;

三、流操作Stream,流的操作有两种:Intermediate(中间)和Terminal(终端 )、short-circuiting(绕过)

常见的流操作可以如下归类:

1、Intermediate

map (mapToInt, flatMap 等)、 filter、 distinct、 sorted、 peek、 limit、 skip、 parallel、 sequential、

unordered

2、Terminal

forEach、 forEachOrdered、 toArray、 reduce、 collect、 min、 max、 count、 anyMatch、

allMatch、 noneMatch、 findFirst、 findAny、 iterator


3、Short-circuiting

anyMatch、 allMatch、 noneMatch、 findFirst、 findAny、 limit

四、并行流ParallelStream

除了普通的stream之外还有parallelStream,区别比较直观,就是stream是单线程执行,parallelStream

为多线程执行。parallelStream的创建及使用基本与stream类似。

不过由于是并行执行,parallelStream并不保证结果顺序,同样由于这个特性,如果能使用findAny就尽

量不要使用findFirst。 使用parallelStream时需要注意的一点是,多个parallelStream之间默认使用的是

同一个线程池,所以IO操作尽量不要放进parallelStream中,否则会阻塞其他parallelStream。

五、Optional

Optional的引入是为了解决空指针异常的问题。

Optional实际上是对一个变量进行封装,它包含有一个属性value,实际上就是这个变量的值。

1、方法

2、使用场景

a、判断结果不为空后使用 ifPresent

Optional s = Optional.ofNullable(test());

s.ifPresent(System.out::println);

b、变量为空时提供默认值 orElse

Optional o = Optional.ofNullable(s);

System.out.println(o.orElse("test"));

c、变量为空时抛出异常 orElseThrow

Optional o = Optional.ofNullable(s);

System.out.println(o.orElseThrow(()->new Exception("test")));