技术推荐系列:函数式编程
写在之前
java8是一个极大的改变。之前有聊过它的新特性,像lambda表达式之类的,这次说下他引入的一个很重要的改变:函数式编程,它不仅有着简介的表达,还有很强的可读性,极大的提高了编码的效率。
函数式接口,放在function包下,支持了不同类型的需要。
而我们日常应用通过stream和optional来实现。
这里着重介绍stream对象的使用。
介绍
for example
这里举几个日常使用的例子:
以collection为例,先组装对象:
RequestDTO对象拥有int count,string id,string name三个参数
List<RequestDTO> requestDTOS = new ArrayList<>(); requestDTOS.add(RequestDTO.builder().count(3).id("3").name("bbb").build());
requestDTOS.add(RequestDTO.builder().count(1).id("1").name("ccc").build());requestDTOS.add(RequestDTO.builder().count(2).id("2").name("aaa").build());
1.foreach,循环输出
requestDTOS.stream().forEach(a -> {
log.info("name:{}", a.getName());
});
2.filter, 过滤器,过滤不满足条件数据
RequestDTO requestDTO1 = requestDTOS.stream()
.filter(a -> StringUtils.equalsIgnoreCase("111", a.getId()))
.findFirst()
.orElse(null);
log.info("name:{}", requestDTO1.getName());
3.map, 直接取出对象中指定参数放入集合中
List<String> s = requestDTOS.stream().map(RequestDTO::getName).collect(Collectors.toList());
s.forEach(System.out::println);
4.sort,排序requestDTOS.stream().sorted(Comparator.comparing(RequestDTO::getName)).collect(Collectors.toList());
requestDTOS.stream().forEach(a ->{
log.info("name:{}", a.getName());
});
5.maptoint, 求对象中数据的和
int sum = requestDTOS.stream().mapToInt(RequestDTO::getCount).sum();
log.info("sum:{}", sum);
等等。
通过上述事例,不难看出,函数式编程的方便之处,如下介绍它的一些常用方法说明:
详细方法说明:
1.sequential
返回一个相等的串行的Stream对象,如果原Stream对象已经是串行就可能会返回原对象
2.parallel
返回一个相等的并行的Stream对象,如果原Stream对象已经是并行的就会返回原对象
3.unordered
返回一个不关心顺序的Stream对象,如果原对象已经是这类型的对象就会返回原对象
4.onClose
返回一个相等的Steam对象,同时新的Stream对象在执行Close方法时会调用传入的Runnable对象
5.close
关闭Stream对象
6.filter
元素过滤:对Stream对象按指定的Predicate进行过滤,返回的Stream对象中仅包含未被过滤的元素
7.map
元素一对一转换:使用传入的Function对象对Stream中的所有元素进行处理,返回的Stream对象中的元素为原元素处理后的结果
8.mapToInt
元素一对一转换:将原Stream中的使用传入的IntFunction加工后返回一个IntStream对象
9.flatMap
元素一对多转换:对原Stream中的所有元素进行操作,每个元素会有一个或者多个结果,然后将返回的所有元素组合成一个统一的Stream并返回;
10.distinct去重:
返回一个去重后的Stream对象
11.sorted
排序:返回排序后的Stream对象
12.peek
使用传入的Consumer对象对所有元素进行消费后,返回一个新的包含所有原来元素的Stream对象
13.limit
获取有限个元素组成新的Stream对象返回
14.skip
抛弃前指定个元素后使用剩下的元素组成新的Stream返回
15.takeWhile
如果Stream是有序的(Ordered),那么返回最长命中序列(符合传入的Predicate的最长命中序列)组成的Stream;如果是无序的,那么返回的是所有符合传入的Predicate的元素序列组成的Stream。
16.dropWhile
与takeWhile相反,如果是有序的,返回除最长命中序列外的所有元素组成的Stream;如果是无序的,返回所有未命中的元素组成的Stream。
详细操作说明:
1.iterator
返回Stream中所有对象的迭代器;
2.spliterator
返回对所有对象进行的spliterator对象
3.forEach
对所有元素进行迭代处理,无返回值
4.forEachOrdered
按Stream的Encounter所决定的序列进行迭代处理,无返回值
5.toArray
返回所有元素的数组
6.reduce
使用一个初始化的值,与Stream中的元素一一做传入的二合运算后返回最终的值。每与一个元素做运算后的结果,再与下一个元素做运算。它不保证会按序列执行整个过程。
7.collect
根据传入参数做相关汇聚计算
8.min
返回所有元素中最小值的Optional对象;如果Stream中无任何元素,那么返回的Optional对象为Empty
9.max
与Min相反
10.count
所有元素个数
11.anyMatch
只要其中有一个元素满足传入的Predicate时返回True,否则返回False
12.allMatch
所有元素均满足传入的Predicate时返回True,否则False
13.noneMatch
所有元素均不满足传入的Predicate时返回True,否则False
14.findFirst
返回第一个元素的Optioanl对象;如果无元素返回的是空的Optional;如果Stream
是无序的,那么任何元素都可能被返回。
15.findAny
返回任意一个元素的Optional对象,如果无元素返回的是空的Optioanl。
16.isParallel
判断是否当前Stream对象是并行的
求个关注!
在看一下呗,顺便点个赞!