函数式接口不光有supplier接口、consumer接口,还有以下:
Predicate
- 表示条件判断
可以用Java.Util.functiion.Predicate<T>接口
- 抽象方法:
Test: 测试:参数代表需要对什么数据进行检测,返回值是boolean值。
- 默认方法:
- And 并且:两者条件必须都满足,“并且”---而且里面lambda的延迟加载的效果在里面。
-
- Or 或者—与上面相反,两者满足其中一个
-
- Nagate 取反,就是将本来的规则变成相反的样子
- Practice
function
java.util.function.function<T,R>接口本身就是一个函数,有一个进去的数据,还有一个出来的数据。根据x拿y.
接口用来根据一个类型的数据得到另一个类型的数据,前者称为前置条件,后者称为后置条件。有进有出,所以称为“函数Function”。
1. 抽象方法:
apply 应用执行
Function 接口中最主要的抽象方法为:R apply(T t) ,根据类型T的参数获取类型R的结果。使用的场景例如:将String 类型转换为Integer 类型。
2. 默认方法:
a). andthen 两个函数拼接成一个大函数,
按照先后顺序 a.andThen(b) 先A后B
b). compose 两个函数拼接成一个大函数,按照先后倒序,
a.compose(b) 先b后a,因为用这比较奇葩,所以不经常用。
c) Consumer与function中andThen的区别:
3. practce
常用函数式接口总结
流的方法分为:延迟拼接与终结方法
Stream流
- 概念
有点那种 传送带 的感觉,它是lambda的衍生物
Java.UtilStream<T>.接口表示一个Java 8 的流,不是IO流。
- 获取Stream流的三种方式
- 通过传统集合获取流,直接调用 .stream 流。
-
- Map映射间接获取流:
Map当中存储的不是一个一个的对象,而是一对儿一对儿的对象。
不能直接Map获取流,只能间接:
-
-
- 所有的键 map.keySet().stream()
- 所有的值:map.values().stream()
- 通过所有的键值对,map.entrySet().stream()
- 数组获取流
- 通过Stream接口的静态方法of Stream.of()
- 通过Arrays工具类的静态方法stream Arrays.Stream([ ]);
-
3.常用的流操作
a) filter如果希望对流当中的元素进行筛选,可以用filter方法。
Stream filter(Predicate predicate):参数是一个筛选的条件。
备注:每次Stream filter 当中的函数模型拼接方法调用(例如filter),都会返回一个新的Stream流。
b). count 当中想要获取元素的个数,应该使用count方法,得到long值。
有点类似集合的size的方法。
c). limit对流进行截取,只要前几个,使用limit方法。
Steream limit(long maxSize);
Limit是最大限度,没有规定必须一定是多少。
d). skip跳过流当中的前几个,可以用skip方法。
Stream skip(int n);
e). map本来Stream<String> 装的都是字符串,转换成为String<Integer>,里面都是数字
这时候可以使用map方法,将每一个字符串都映射到数字身上。String—>Integer
map方法的参数是一个Function<T, R>接口,代表如何进行映射的规则。 第一个泛型代表本来的数据是什么类型 第二个泛型代表后来的数据是什么类型
f).Contact如果希望两个流合并成为一个整体,那么使用concat方法。
这是Stream接口当中的静态方法,有两个参数。 不是a.concat(b),而应该是Stream.concat(a, b)
g).forEach如果希望对流当中的元素进行遍历逐一消费(例如打印),那么可以使用forEach方法。参数是一个Consumer接口。
使用Stream流注意事项
1. Stream流 和StringBuilder 不一样:
a). StringBuilder例如append等方法,
b). Stream流虽然也返回接口自身类型
c). Stream流是一次性使用的,不能二次使用。IllegalStateException异常。
- Stream当中的并发操作
- 直接获取并发流调用.parallelStream()方法
- 已经有了一个普通的流,变成并发的流:后续调用.parallel()方法
- 将流当中的数据收集到集合当中。
只需要调用Stream接口当中的.collection(Collector collector)方法。
常用的集合就是List和set。
Collevtions提供了两个方法:
- Collectors.toList();
- Collectors.toSet();
- 将流的结果收集到数组里。
- 直接使用toArray()方法得到Object[]。
- 通过.toArray(数组构造器引用),得到指定类型数组。
- Practice
扩展:spliterrator
为什么用并发流而不用锁?
并发流是分而自治
因为并发流供Stream底层使用的原理是Java7当中的ForkJoinPool.