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")));
网友评论