`

Java8 随笔记录(四)

    博客分类:
  • jdk8
阅读更多

Stream还可以像数据库的操作那样处理数据:比如分组、分区、汇总等等。

导入Collectors类中的所有静态方法,使用时不再需要Collectors.去调用,直接使用即可:

importstatic java.util.stream.Collectors.*;

 

1、数据分组: groupingBy

List<String> views = Lists.newArrayList("wsbs","xafaswzx","b8fw","ad");

Map<Integer, List<String>> res = views.stream().collect(groupingBy(String::length));

//{2=[ad], 4=[wsbs, b8fw], 8=[xafaswzx]}

 

2、将收集的结果转换为另一种类型: collectingAndThen

Map<Integer, Object> res = views.stream().collect(

              groupingBy(String::length, Collectors.collectingAndThen(                 

                        Collectors.maxBy(Comparator.comparingInt(String::length)),

                       Optional::get  // 为转换函数,转换最终的数据 

              ))

);

System.out.println(res);

// {2=ad, 4=wsbs, 8=xafaswzx}

 

3、多级分组: 嵌套使用groupingBy即可

List<String> views = Lists.newArrayList("wsbsq","hello word","b8fw", "word", "wall", "ad");

Map<Object, Map<Object, List<String>>> res = views.stream()

                                          .collect(groupingBy(str -> str.charAt(0), groupingBy(String::length)));

System.out.println(res);

// {a={2=[ad]}, b={4=[b8fw]}, w={4=[word, wall], 5=[wsbsq]}, h={10=[hello word]}}

 

4、统计子组数据

List<String> views = Lists.newArrayList("wsbsq","hello word","b8fw", "word", "wall", "ad");

Map<Integer, Long> res = views.stream()

                                     .collect(groupingBy(String::length, Collectors.counting()));

System.out.println(res);

// {2=1, 4=3, 5=1, 10=1}

 

5、数据分区: partitioningBy

分区函数必须返回一个boolean值,也就是说最后的分区组一个是true,一个是false。

List<String> views = Lists.newArrayList("wsbs","1232","b8fw","wsad");

Map<Boolean, List<String>> res = views.stream().collect(

                                                     partitioningBy(str -> str.startsWith("ws")));

//{false=[1232, b8fw], true=[wsbs, wsad]}

 

// 分区中再进行分组

Map<Boolean, Map<Object, List<String>>> res = views.stream().collect(Collectors.partitioningBy(str -> str.startsWith("ws"),

Collectors.groupingBy(String::length)));

 

//{false={3=[232], 6=[b8sdfw]}, true={2=[ws], 4=[wsad]}}

 

6、转换成值:maxBy、minBy

List<String> views = Lists.newArrayList("wsbs","xafaswzx","b8fw","ad");

Optional<String> res = views.stream().collect(

                                minBy(Comparator.comparing(String::length)));

System.out.println(res.get());  //ad

minBy的最终实现: (a, b) -> comparator.compare(a, b) <= 0 ? a : b

maxBy的最终实现: (a, b) -> comparator.compare(a, b) >= 0 ? a : b

 

7、将流中的数据转换成整型后汇总求和: summingInt

List<String> views = Lists.newArrayList("wsbs","xafaswzx","b8fw","ad");

Integer resInt = views.stream()

                 .collect(summingInt(String::length));

System.out.println(resInt);  //18

若为summingLong,同样输出18

若为summingDouble,则输出18.0

 

8、拼接字符串: joining 

// wsbs-xafaswzx-b8fw-ad

System.out.println(views.stream().map(s -> s).collect(joining("-")));

 

9、映射: mapping(Person::getLastName, toSet())

即mapping操作可将左参数(lambda表达式,用于对流中元素做变换)产生的数据动态记录到右参数(集合,将变换的结果收集到集合)中,其内部实现也是通过工厂容器 + 累加器 + 组合器来实现的。

而和groupingBy一起使用的收集器一般也是由mapping方法生成的,当然也包含其他方法。

 

10、Collectors类中的静态工厂方法:

工厂方法 返回类型 用于
toList List<T>

 把流中的所有数据元素收集到List集合中。

stream.collect(toList());

 toSet Set<T>

 把流中的所有数据元素收集到Set集合中,以为Set自身的特性,即不会出现重复

项。stream.collect(toSet());

 toCollection Collection<T>

 把流中的数据元素收集你所指定的集合中,

list.stream().collect(toCollection(ArrayList::new));

 counting Long

 计算流中元素的个数,list.stream().collect(counting());

 summingInt Integer

 对流中所有元素上指定的整数属性求和,

list.stream().collect(summingInt(User::getAge));

 averagingInt Double

 对流中所有元素上指定的整数属性求平均数,

list.stream().collect(averagingInt(User::getAge));

 summarizingInt

IntSummaryStatistics

 收集流中所有元素上指定的整数属性的统计值,包括最大值、最小值、总数、平均值。

list.stream().collect(summarizingInt(User::getAge));

joining String

 连接流中元素上指定的属性,

list.stream().map(s -> s).collect(joining("-"))

 maxBy Optional<T>

使用指定的比较器去比较得到流中所有元素上指定属性的最大值,

list.stream().collect(maxBy(Comparator.comparing(String::length)))

 minBy Optional<T> 使用指定的比较器去比较得到流中所有元素上指定属性的最小值,

list.stream().collect(minBy(Comparator.comparing(String::length)))

 reducing 规约操作产生的类型

从一个累加器的初始值开始,使用BinaryOperator与流中的元素逐个集合,最后将流规约为单个值。

list.stream().collect(reducing(0, UserVO::getAge, Integer::sum));

 collectingAndThen  转换函数返回的类型

 对最终结果转换为另一种类型,

list.stream().collect(collectingAndThen(Collectors.toList(), List::size));

 groupingBy  Map<k, List<T>>

 根据指定的属性来分组,

views.stream().collect(groupingBy(String::length));

 partitioningBy  Map<boolean, List<T>>

 根据指定的属性来分区,

 views.stream().collect(partitioningBy(str -> str.startsWith("ws"))

 

11、11interface Collector<T, A, R>

 当遇到不同的业务需求时,可能会需要自己去实现收集器的功能,就必须得实现Collector接口了,大概包含如下几个方法:

 

1)Supplier<A> supplier();

      用于创建并返回一个新的可变结果的容器。

 

2)BiConsumer<A, T> accumulator();

      将元素添加到结果容器中。

 

3)BinaryOperator<A> combiner();

      合并两个结果容器。

 

4)Function<A, R> finisher();

      对结果容器应用最终转换。      

 

5)Set<Characteristics> characteristics();

      返回一个不可变的Characteristics集合。

      其中Characteristics为一个枚举类,包含这3个值:CONCURRENT、UNORDERED、IDENTITY_FINISH。

      UNORDERED:归约结果不受流中项目的遍历和累积顺序的影响。

      CONCURRENT:支持多线程同时调用,可进行并行归约,但只有在没有被标识为UNORDERED才用于无序数据源的并行归约。

       IDENTITY_FINISH:表示finisher函数返回的是一个恒等函数,可以不用设置。

 

分享到:
评论

相关推荐

    java记录随笔

    Java 记录随笔 Java 记录随笔是关于 Java 软件架构设计的笔记,涵盖了软件架构的基本原则、当前流行的技术、数据库存储结构、Web 界面用户接口层、业务层架构、持久层技术、XML 结构化信息传输和存储的重要性等多个...

    ubuntu搭建Java项目运行环境-随笔记录.rar

    JAVA_HOME="/usr/lib/jvm/java-8-oracle" PATH="$PATH:$JAVA_HOME/bin" ``` 保存并关闭文件,然后使更改生效: ```bash source /etc/environment ``` 接下来,我们需要安装MySQL 5.7。同样地,使用apt来安装: `...

    Java学习随笔7(进制).docx

    每四位二进制数对应一个十进制数,如二进制的1101代表十进制的13,因为1*8 + 1*4 + 0*2 + 1*1 = 8 + 4 + 0 + 1 = 13。8421码在某些特定的数字处理场景中很有用,如电子表格软件或计算器。 Java中的位运算,如与(&)...

    工作随笔-记录遇到的知识点

    在Java世界,Map对象转换为实体类通常是通过ORM框架如MyBatis Plus完成的,而实体类转化为JSON则可以借助Jackson或Gson库。例如,使用Gson库,可以写成`Gson gson = new Gson(); String jsonString = gson.toJson...

    Java基于SWT编写记事本

    9. **帮助文档**:附带的开发随笔手册可能包含关于如何使用该记事本的详细说明,对于初学者来说非常有帮助。 开发这样的程序需要对Java语言、SWT库以及面向对象设计有深入理解。通过这个项目,开发者不仅可以掌握...

    2014210-2014307笔记随笔

    标题“2014210-2014307笔记随笔”暗示了这是一份时间跨度从2014年2月10日至3月7日的个人学习记录,可能包含了作者在IT领域的所学所悟,特别是关于编程、软件开发或系统设计的思考。由于描述部分为空,我们无法直接...

    Android App_云随笔课程设计

    在开发“Android App_云随笔课程设计”项目时,我们面临的是构建一个移动应用程序,旨在帮助用户便捷地记录他们的日常生活、旅行体验、心情点滴以及学习笔记等。这个应用程序的关键特性在于其同步功能,它将用户的...

    JavaThings:共享与Java相关的东西-Java安全漫谈笔记相关内容

    JavaThings-Java安全漫谈笔记相关《 Java安全漫谈》是我在写的一点Java学习相关的随笔,不是很严谨,也不是啥高科技。这个存储库主要是记录并整理一下,附加一些代码。Java安全漫谈目录 人口统计字节码:远程字节码...

    Ibatis学习随笔.doc

    在提供的示例中,我们看到了四种不同的Statement类型: 1. `select`:用于查询数据。例如,`getTuser`方法通过`id`获取`tuser`表中的记录。`resultClass`属性指定了结果对象的类,`#value#`是一个占位符,会被传入...

    DCSweb随笔

    例如,可能会讲解使用如Python、C++或Java等语言进行系统开发,或者如何利用现有的开源项目如OPC-UA、Modbus等进行通信协议的实现。源码分析部分可能涉及代码调试、性能优化和错误处理等内容。 “工具”标签表明...

    Log4j2手册阅读随笔(Log4j2新特性)

    Apache Log4j2 是一个广泛使用的Java日志记录库,它提供了一个强大和灵活的方式来记录应用程序事件。Log4j2手册详细介绍了该库的各个方面,包括架构、迁移、API、配置、Web应用程序集成、插件、查找、Appenders、...

    基于JAVA的幼儿园家园共育平台设计与实现-需求.zip

    基于JAVA幼儿园家园共育平台设计与实现 开发语言 JavaWeb前端语言  开发工具:六年特雷利JIDEA ...童言稚语:每月记录一次幼儿有趣的话语,文字展示。 育儿头条:育儿新闻文章。管理员上传,可评论点赞

    java源码博客-source:个人博客,记录一些学习和实践的总结

    java 源码 博客 一杯82年的JAVA 大家好,我是练习时常两年半的JAVA练习生,爱好是 ...博客专用仓库,主要记录一些学习和实践的总结,感兴趣的朋友可以点个watch或star。 随笔 探索JAVA并发 从0.5到1写个RPC框架

    阶段程序汇总

    无论是通过阅读"课堂问题随笔.txt"来解决疑惑,还是通过"必须记住的代码君们"来熟悉常用代码,亦或是通过"Entertainment"中的项目来提升编程技巧,都能有效地促进Java学习的进程。同时,"总结文件"和"瞎搞"部分则...

    随笔集

    1. **技术基础知识**:随笔可能涵盖基础的编程语言知识,如Python、Java或C++的语法特性,数据结构和算法的应用,以及软件工程的基本原则。 2. **项目经验分享**:作者可能会分享他们在实际项目中遇到的问题及解决...

    java版植物大战僵尸源码-Todo:定个计划好好学习

    列表参考国光大佬的国光的安全随笔记录 安全技能 该技能表不用按顺序进行学习,但是比较高级的我会放最后面,因为我也不会,需要花时间慢慢加。 总结我这几年的一点经验:安全需要学习的技术太多了,特别是红队、...

    JVM自动内存管理机制

    Java自动内存管理机制包含两部分:内存分配和内存回收,要想理解内存分配和回收的机制,则需要了解下Java内存区域(Java运行时数据区),这篇随笔将按照下面的线索进行逐步解析:1.Java运行时数据区2.对象“已死”的...

    Logger.rar

    3. 在代码中使用:在Java代码中,通过Logger类获取日志实例,然后调用如info(), warn(), error()等方法记录日志。 四、日志子文件Logger 压缩包中的"Logger"可能是具体的日志实现类或配置文件。如果是类文件,它...

    MiaoWu:毕业设计-流浪猫收养系统

    MiaoWu毕业设计-流浪猫收养系统过程随笔记录通知:1.用户关注用户2.关注的用户发帖3.帖子审核结果4.领养申请5.领养审核结果发帖:需发帖人有联系方式帖子详情页 数据获取顺序调整实现头像修改功能修改记录1.修改猫咪...

Global site tag (gtag.js) - Google Analytics