vlambda博客
学习文章列表

技术推荐系列:函数式编程




写在之前


   

    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对象是并行的






技术推荐系列:函数式编程




技术推荐系列:函数式编程

求个关注!

在看一下呗,顺便点个赞!