预设场景:

从Mybatis调用Mapper得到的用户集合

List<UserDTO> userList = new ArrayList<>();

常用的几种API用法示例:

Map方法,转换为某一个字段的集合:

List<Integer> userIdList = userList.stream()
/* map 转换成某个类型来处理,比如这个场景是为了快速提取用户id */
.map(UserDTO::getId)
.collect(Collectors.toList());

Distinct方法,对基本类型支持去重处理:

 List<Integer> distinctUserIds = userIdList.stream()
/* distinct 可对元素进行去重,推荐类型是基础包装类和String两种 */
.distinct()
.collect(Collectors.toList());

 

FlatMap方法,支持更深维度的处理:

List<String> fun1 = Arrays.asList("one", "two", "three");
List<String> fun2 = Arrays.asList("four", "five", "six");
List<List<String>> nestedList = Arrays.asList(fun1, fun2);
nestedList.stream()
/* flatMap 可以支持更深维度的集合转换,stream合并处理 */
.flatMap(x -> x.stream()).map(x->x.toUpperCase())
.forEach(System.out::println);

 

Filter方法,根据条件对集合进行过滤处理

检查名称是否包含张字的用户

List<UserDTO> matchUsers = userList.stream()
/* filter 用于检索匹配条件方法的元素 */
.filter(user -> user.getUserName().contains("张"))
/* 存在多个情况可以使用 toList 收集匹配的元素 */
.collect(Collectors.toList());

  

FindFirst和FindAny方法,筛选为单个

UserDTO userDTO = matchUsers.stream()
.filter(user -> "1001".equals(user.getId().toString()))
/* 或者使用 findFirst && findAny 提取唯一一个元素 */
.findFirst()
.get();

  

AnyMatch与AllMatch 对集合进行匹配判断:

boolean anyMatch = userList.stream()
/* anyMatch 检查任意元素是否符合匹配方法,反之 allMatch 要求所有元素符合 */
.anyMatch(user -> 3001 > user.getId());

  

GroupBy 等同SQL的GroupBy,但是只能是单个字段的

Map<String, List<UserDTO>> userGroupMap = userList.stream()
/* groupingBy 指定以什么值作为分组的条件,这里以用户的组名称进行分组 */
.collect(Collectors.groupingBy(UserDTO::getGroupName));

  

PartitionBy 则根据你的自定义的方法具体分组,但是只有true和false两种:

 final Integer superPermit = 1001;
Map<Boolean, List<UserDTO>> permitPartMap = userList.stream()
/* partitioningBy 使用条件进行分区处理,场景:检查是不是超级权限的用户, 分区为 超级权限用户(true)和非超级权限用户(false) */
.collect(Collectors.partitioningBy(user -> user.getRoleIds().contains(superPermit)));

Skip与Limit 对集合支持翻页操作:

/* 用于集合的翻页操作, 等同SQL的LIMIT 10, 20 */
List<UserDTO> collect = userList.stream()
.skip(10).limit(20)
.collect(Collectors.toList());

  

Reduce 对集合进行聚合操作:

/* reduce用于聚合处理,例如合计这个用户集合的现金 */
BigDecimal userCashAmount = userList.stream()
.map(UserDTO::getAmount)
.reduce(new BigDecimal(0), BigDecimal::add);

  

  

【Java】讲讲StreamAPI的更多相关文章

  1. java讲讲几种常见的排序算法(二)

    java讲讲几种常见的排序算法(二) 目录 java讲讲几种常见的排序算法(一) java讲讲几种常见的排序算法(二) 堆排序 思路:构建一个小顶堆,小顶堆就是棵二叉树,他的左右孩子均大于他的根节点( ...

  2. java讲讲几种常见的排序算法

    java讲讲几种常见的排序算法(一) 目录 java讲讲几种常见的排序算法(一) java讲讲几种常见的排序算法(二) 以数组array={6,3,20,8,15,1}为例 冒泡排序 思路:从第0个到 ...

  3. Spark案例分析

    一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...

  4. 从Tomcat无法正常关闭讲讲Java线程关闭问题【转载】

    正常情况下,会优先采用catalina.sh stop来停止Tomcat实例,这样可以让服务有机会处理完请求,并做好善后工作. 但如果通过catalina.sh stop命令无法关闭Tomcat实例, ...

  5. 每日一问:讲讲 Java 虚拟机的垃圾回收

    昨天我们用比较精简的文字讲了 Java 虚拟机结构,没看过的可以直接从这里查看: 每日一问:你了解 Java 虚拟机结构么? 今天我们必须来看看 Java 虚拟机的垃圾回收算法是怎样的.不过在开始之前 ...

  6. java中讲讲PrintWriter的用法,举例?

    [学习笔记] 1.2 PrintWriter的用法 PrintWriter和PrintStream类似,只不过PrintStream是针对字节流的,而PrintWriter是针对字符流的. 例:1.2 ...

  7. java中讲讲DataInputStream的用法,举例?

    [学习笔记] 2.4 DataInputStream的用法 马 克-to-win:DataInputStream顾名思义:就是专门用来读各种各样的数据的,比如(int,char,long等),一定要注 ...

  8. java中讲讲PrintStream的用法,举例?

    [学习笔记] 1.2 PrintStream的用法   从学java第一天,我们就经常用到System.out.println(),实际上查阅文档可知,System.out就是Sun 编的一个Prin ...

  9. 讲讲java中线程池的实现

    今天跟一个同学谈到java中的线程池的实现,才发现有些知识点已经记不清了,所以特意把源码打开,对官方文档做了些说明. 其实这些理解了之后,读懂源码应该是没多大问题了,有感兴趣的小伙伴们可以看完说明后自 ...

  10. 今儿直白的用盖房子为例,给你讲讲Java建造者模式

    摘要:建造者模式(Builder Pattern)又叫生成器模式,是一种对象构建模式.它可以将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方法可以构造出不同表现(属性)的对象. 本 ...

随机推荐

  1. 穿透 wsl 和 ssh, 新版本 neovim 跨设备任意复制,copy anywhere!

    获得更好的阅读体验,欢迎查看原文:穿透 wsl 和 ssh, 新版本 neovim 跨设备任意复制,copy anywhere! 1. 创作动机 最近一个星期,我入坑了 neovim, 然后开始配置各 ...

  2. C# 利用Autofac批量接口注入依赖【学习记录】

    背景: 本人在一位大佬的Colder框架中看到了这个接口注入,然后呢就想学习一下ioc思想与di设计模式.此写法给我的感觉就是 非常的 优雅 ,优雅永不过时.关于接口注入的概念和ioc和di具体是什么 ...

  3. jquery的折叠动画 渐隐渐显动画

     <button name="up">折叠隐藏</button>     <button name="down">折叠显示& ...

  4. SQL 如何去掉字段中千位的逗号(比如set @= '1,320.00' 想得到@= '1320.00' )

    1/去掉字段里的逗号.(比如set @= '1,320.00' 想得到@= '1320.00' )UPDATE table SET fieldA = REPLACE(fieldA, ',', '') ...

  5. 判断一个数n是不是快乐数

    引言 题目:编写一个算法来判断一个数n是不是快乐数 来源:网友分享的面试算法题 题目描述 [快乐数定义] 对于一个正整数,每一次将该数替换为它每个位置上的数字的平方和. 然后重复这个过程直到这个数变为 ...

  6. 前端实现预览PDF

    下载包 npm install react-pdf 我使用的是react-pdf@5.7.2版本 以下例子使用的是react创建的项目 直接上代码=>cv可用,保证高效 1.新增依赖 yarn ...

  7. XAF 属性编辑器(PropertyEditor)- 原理篇

    前言 随着 DEV24.1.3 的发布,XAF Blazor 中的属性编辑器(PropertyEditor)也进行了很大的改动,在使用体验上也更接近 WinForm 了,由于进行了大量的封装,理解上没 ...

  8. Js 实现导航li列表,选中时,显示选中样式

    结合Django项目实现 实现步骤: html页面部分,使用bootstrap.css中的样式(不用可忽略,主要class样式),要引用bootstrap.css,使用到actvie样式: <l ...

  9. 实验8.Vlan Hybrid实验

    # 实验8.Vlan Hybrid实验 本实验用于测试华为独有的混合式接口类型hybrid 实验组 配置交换机 对交换机sw1与sw2做具体配置 SW1 vlan ba 10 20 100 int g ...

  10. 使用 Spring 实现控制反转和依赖注入

    使用 Spring 实现控制反转和依赖注入 概述 在本文中,我们将介绍IoC(控制反转)和DI(依赖注入)的概念,以及如何在Spring框架中实现它们. 什么是控制反转? 控制反转是软件工程中的一个原 ...