书籍Java8 实战 笔记

news2025/8/13 5:38:35

第5章 使用流

本章内容
1.筛选、切片和匹配
2.查找、匹配和归约
3.使用数值范围等数值流
4.从多个源创建流
5.无限流

5.1 筛选和切片

用谓词筛选,筛选出各不相同的元素,忽略流中的头几个元素,或将流截短至指定长度。

5.1.1 用谓词筛选

就是filter方法,filter()里面的参数是一个布尔值函数,然后会返回为true的流。

5.1.2 筛选各异的元素

使用distinct()方法,就是会去除重复的数据

@Test
public void test(){
    List<Integer> numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4);
    numbers.stream()
            .filter(i -> i % 2 == 0)
            .distinct()
            .forEach(System.out::println);
}
结果: 2    4

5.1.3 截短流

@Test
public void test(){
    List<Integer> numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4);
    numbers.stream()
            .filter(i -> i % 2 == 0)
            .distinct()
            .limit(1)
            .forEach(System.out::println);
}
结果  2

5.1.4 跳过元素

skip(n),丢掉前n个元素的流,如果流中元素不足n个会返回一个空流。

@Test
public void test(){
    List<Integer> numbers = Arrays.asList(1, 2, 1, 3, 3, 2, 4);
    numbers.stream()
           .skip(1)
           .forEach(System.out::println);
}
2 1 3 3 2 4

5.2 映射

流支持map方法,它会接受一个函数作为参数,这个函数会应用到每个元素之上,然后会将其映射成一个新元素。

List<String> dishNames = menu.stream()
                             .map(Dish::getName)
                             .collect(Collectors.toList());

上面这个就是把Dish::getName方法传给了map,作用于所有的元素,但在map方法处理后输出的还是流是Stream

5.2.1 流的扁平化

例:如果将一个单词列表[“Hello”,“World”]想转化为[“H”,“e”,“l”, “o”,“W”,“r”,“d”]

public static void main(String[] args) {
    List<String> words = new ArrayList<>();
    words.add("Hello");
    words.add("World");
    List<String[]> list = words.stream()
            .map(word -> word.split(""))
            .distinct()
            .collect(Collectors.toList());
}
words.stream()  
     .map(item -> item.split(""))         Stream<String[]>  
     .distinct()                          Stream<String[]>  
     .collect(toList());                  List<String[]>
     
返回的是List<String[]>并非List<String>

但这么处理map返回的是Stream<String[ ]>类型(先是把每个单词转换成一个字母数组,然后把每个数组变成了一 个独立的流),而正确的处理应该是用Stream来表示一个流。
这里就可以使用flatMap来解决这个问题

List<String> uniqueCharacters = words.stream()  
                                     .map(w -> w.split(""))  
                                     .flatMap(Arrays::stream)   
                                     .distinct()  
                                     .collect(Collectors.toList());

flatMap(Arrays::stream) 会将单个流合并起来。

5.3 查找和匹配

另一个常见的数据处理套路是看看数据集中的某些元素是否匹配一个给定的属性。Stream API通过allMatch、anyMatch、noneMatch、findFirst和findAny方法提供了这样的工具。
allMatch: 流中所有元素是否能够匹配给定的谓词
anyMatch:流中是否有一个元素能够匹配给定的谓词
noneMatch:没有任何元素与给定的谓词匹配
findAny:返回当前流中的任意元素,可以与其他流操作结合使用。

Optional<Dish> dish = menu.stream()  
                          .filter(Dish::isVegetarian)  
                          .findAny();
补充一个无关的:
Optional.ofNullable(mp.selectList(queryWrapper)).orElse(new ArrayList<>(0));

5.4 规约

5.4.1 元素求和

int sum = numbers.stream().reduce(0 , (a,b)->a+b);

int sum = numbers.stream().reduce(0 , Integer::sum);

5.4.2 最大值和最小值

Optional<Integer> max = numbers.stream().reduce(Integer::max);  ```

```java
 Optional<Integer> min = numbers.stream().reduce(Integer::min); 

comparing补充

在这里插入图片描述

附录

// 获取结果中的排期id与用户id,其中key为排期id,value为该排期下所有用户id的集合
Map<Integer, List<String>> userAndScheduleMaps = scheduleStudentPage.getRecords().stream()
        .collect(Collectors.groupingBy(CourseScheduleStudentEntity::getCourseScheduleId,
                Collectors.mapping(CourseScheduleStudentEntity::getUserId, Collectors.toList())));

在这里插入图片描述
在这里插入图片描述

部分无关代码记录

Map map = new HashMap();  //定义Map集合对象
map.put("apple", "新鲜的苹果");  //向集合中添加对象
map.put("computer", "配置优良的计算机");
map.put("book", "堆积成山的图书");
Collection values = map.values();  //获取Map集合的value集合
for (Object object : values) {
    System.out.println("键值:" + object.toString());  //输出键值对象
}
键值:新鲜的苹果
键值:配置优良的计算机
键值:堆积成山的图书

过滤不为空
List<Object> departmentIds = staffInfoList.parallelStream()
        .map(FeishuStaffsEntity::getOpenDepartments)
        .distinct()
        .filter(Objects::nonNull)
        .collect(Collectors.toList());

LambdaQueryWrapper<EArticleAnchorEntity> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper
        .eq(EArticleAnchorEntity::getArticleId, articleId)
        .eq(EArticleAnchorEntity::getAnchor, articleAnchor);
EArticleAnchorEntity eArticleAnchorInfo = eArticleAnchorDao.getOne(queryWrapper,false);
Validator.notNull(eArticleAnchorInfo,"参数错误:未找到锚点记录");


private Map<String, CourseReportBo> getReportAndState(Page<CourseScheduleStudentEntity> scheduleStudentPage) {

        // 获取结果中的排期id与用户id,其中key为排期id,value为该排期下所有用户id的集合
        Map<Integer, List<String>> userAndScheduleMaps = scheduleStudentPage
                .getRecords()
                .stream()
                .collect(Collectors.groupingBy(CourseScheduleStudentEntity::getCourseScheduleId,
                        Collectors.mapping(CourseScheduleStudentEntity::getUserId, Collectors.toList())));

        // 获取用户report报告
        LambdaQueryWrapper<StatisticCourseSheduleStudentEntity> conds = new LambdaQueryWrapper<>();
        userAndScheduleMaps.entrySet().stream().forEach(userAndScheduleMap -> {
            conds.or(idEntity -> {
                idEntity.eq(StatisticCourseSheduleStudentEntity::getCourseScheduleId, userAndScheduleMap.getKey());
                idEntity.in(StatisticCourseSheduleStudentEntity::getUserId, userAndScheduleMap.getValue());
            });
        });
        List<StatisticCourseSheduleStudentEntity> entityResult = statisticCourseSheduleStudentDao.listByConds(conds);

        return entityResult.stream().filter(
                entity -> StringUtils.isNotBlank(entity.getReport()))
                .collect(Collectors.toMap(
                        entity -> entity.getCourseScheduleId() + ":" + entity.getUserId(),
                        entity -> JSONObject.parseObject(entity.getReport(), CourseReportBo.class)
                ));
    }


.sorted(Comparator.comparing(StudentExamRecordVo::getChapterName)
                        .thenComparing(StudentExamRecordVo::getSectionName)
                        .thenComparing(StudentExamRecordVo::getStartTime))
                .collect(Collectors.toList());

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/33327.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【优化分配】粒子群算法求解火车票分配优化问题【含Matlab源码 1137期】

⛄一、粒子群算法简介 1 引言 自然界中的鸟群和鱼群的群体行为一直是科学家的研究兴趣所在。生物学家Craig Reynolds在1987年提出了一个非常有影响的鸟群聚集模型&#xff0c;在他的仿真中&#xff0c;每一个个体都遵循&#xff1a;避免与邻域个体相撞&#xff1a;匹配邻域个体…

vue3+vite中使用vuex

前言&#xff1a; 在vue3vite创建的项目中使用vuex&#xff0c;要注意的是vite有部分写法和之前的webpack是不同的&#xff0c;比如&#xff0c;他不支持 require&#xff0c;想把vue2的项目直接升级到vue3的时候&#xff0c;需要改很多地方&#xff0c;如果非要使用vite也可以…

Caffeine《二》

《Caffeine&#xff08;Java顶级缓存组件&#xff09;二》 提示: 本材料只做个人学习参考,不作为系统的学习流程,请注意识别!!! 《Caffeine&#xff08;Java顶级缓存组件&#xff09;》《Caffeine&#xff08;Java顶级缓存组件&#xff09;二》8. 缓存驱逐算法8.1 FIFO(First …

ThingsBoard源码解析-设备连接

整体流程 在MqttTransportHandler中进行Mqtt消息处理&#xff0c;以AccessToken认证的设备举例&#xff0c;核心处理流程如下&#xff1a; //MqttTransportHandler 132 processMqttMsg(ctx, (MqttMessage) msg); //MqttTransportHandler 154 processConnect(ctx, (MqttConne…

视频文件转换器有哪些?什么视频文件转换器好用?

视频承载着丰富的文字、声音、图像&#xff0c;能够多维度地调用人的感知能力&#xff0c;可以说是当今时代信息输入的重要载体。 而视频有avi、rm、rmvb、3 gp等多种格式&#xff0c;当我们使用不同设备来观看视频时&#xff0c;就涉及到视频文件格式转换这一问题&#xff0c;…

RabbitMQ系列【14】备份交换机

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录前言代码实现测试前言 在之前&#xff0c;我们分析了消息可靠性之发布确认、退回机制。当消息到达交换机后&#xff0c;但是没有找到匹配的队列时&#xff0c;退回模式&#xff08;return&…

ms10-046漏洞利用+bypassuac提权

目录 前期准备 漏洞利用 上传文件到目标主机 UAC介绍 使用bypassuac模块绕过uac进行提权。 关于钓鱼链接的拓展 前期准备 Win xp sp3关闭防火墙 实验前提 保证连通性&#xff0c;进行互ping 漏洞利用 进入msf查看需要利用的漏洞&#xff1a;ms10-046 search ms10-046 …

【Kafka】单分区单副本增加至多分区多副本

一、背景 系统&#xff1a;CentOS Linux release 7.9.2009 (Core) Kafka版本&#xff1a;2.11-2.0.0.3.1.4.0-315 [scala版本2.11&#xff1b;kafka 2.0.0版本&#xff1b;基于ambari3.1.4.0-315的版本 ] 二、现象 业务系统中总是报警&#xff1a;kafka消费延迟。 三、问题…

nodejs+vue+elementui线上买菜系统

本线上买菜系统主要包括三大功能模块&#xff0c;即管理员和用户。 &#xff08;1&#xff09;管理员模块&#xff1a;首页、个人中心、用户管理、商品分类管理、商品信息管理、系统管理、订单管理。 &#xff08;2&#xff09;前台&#xff1a;商品信息、公告信息、个人中心、…

java语言概述

目录 JDK和JRE的说明 Java语言的环境搭建 常用的DOS命令 第一个Java程序 创建java源文件 Hello.java 编译 步骤三&#xff1a;运行 总结 注 释(comment) JDK和JRE的说明 关系说明图 2、 概念说明 JDKJREJAVA开发工具&#xff08;javac.exe java.exe、javaboc.exe&…

SpringIoc依赖查找-5

1. 依赖查找的今世前生: Spring IoC容器从Java标准中学到了什么? 单一类型依赖查找 JNDI - javax.naming.Context#lookup(javax.naming.Name) JavaBeans - java.beans.beancontext.BeanContext 集合类型依赖查找 java.beans.beancontext.BeanContext 集合查找方法 层…

基于android的移动学习平台(前端APP+后端Java和MySQL)

一、需求规格说明书 1&#xff0e;概述 1.1项目目的与目标, &#xff08;1&#xff09; 项目目的&#xff1a;设计并实现网络化的在线学习系统&#xff0c;对校内课程教学进行辅助&#xff0c;为学生和教师提供一个良好的互动平台&#xff0c;方便学生课后获取学习资源和进行交…

阿里云负载均衡SLB,HTTPS动态网站部署负载均衡,实现高并发流量分发

第一步购买服务器&#xff0c;测的话一般就用按量付费几毛钱一小时 我是用了三台&#xff0c;一台是常用的服务器&#xff0c;两台临时服务器进行部署项目 2&#xff1a;服务器购买完之后&#xff0c;开始安装项目运行环境&#xff0c;我是宝塔一键按键的&#xff0c;PHP7.1。…

新知实验室-基于腾讯云音视频TRTC的微信小程序实践

前言 腾讯会议是我们常用的一款线上会议软体&#xff0c;如果想要使用&#xff0c;我们需要下载软体使用&#xff0c;相比之下&#xff0c;基于腾讯云音视频的TRTC提供了一个很好的解决方案&#xff0c;我们通过接入到小程序中来实现快捷的开始会议&#xff0c;加入会议。 TR…

[Power Query] 删除错误/空值

数据导入后&#xff0c;有可能出现错误(Error)或者空值(null) &#xff0c;我们需要对此进行删除。为此&#xff0c;本文通过讲解Power Query中的删除错误/空值操作&#xff0c;帮助大家的同时也便于日后自身的复盘学习 数据源 将数据源导入到Power BI Desktop&#xff0c;单击…

VSCode中Prettier插件依赖安装及冲突解决

文章目录一、Prettier插件安装1.1 安装Prettier插件1.2 添加Prettier配置文件1.3 配置格式化工具1.4 配置自动格式化1.5 与ESLint冲突解决二、Prettier依赖安装2.1 安装依赖2.2 配置2.3 配置指令2.4 其他配置和冲突解决一、Prettier插件安装 1.1 安装Prettier插件 通过VSCode…

[附源码]计算机毕业设计JAVA流浪动物救助系统

[附源码]计算机毕业设计JAVA流浪动物救助系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybati…

【算法基础】(一)基础算法 --- 快速排序

✨个人主页&#xff1a;bit me ✨当前专栏&#xff1a;算法基础 &#x1f525;专栏简介&#xff1a;该专栏主要更新一些基础算法题&#xff0c;有参加蓝桥杯等算法题竞赛或者正在刷题的铁汁们可以关注一下&#xff0c;互相监督打卡学习 &#x1f339; &#x1f339; &#x1f3…

游戏品类加速回暖,文娱内容持续火热——2022年IAA行业品类发展洞察系列报告·第三期

易观分析&#xff1a;易观分析联合穿山甲与巨量算数共同构建IAA发展指数&#xff0c;通过行业规模、内容热度、商业变现的多维数据指标反映行业细分品类的发展情况&#xff0c;对领域季度运行情况、热门品类进行分析解读&#xff0c;助力开发者深入洞察领域特性和发展趋势&…

【American English】美语的连读规则

文章目录连读规则1. 辅音 元音2. 辅音 辅音情形1: 相同或相近的辅音相遇情形2: 辅音 h情形3: 爆破音 [l] / [m] / [n]情形4: 爆破音 [f] / [v]情形5: 爆破音 [tf]/[]3. 元音 元音情形1: 嘴唇变平时增加 [y] 音情形2: 嘴唇变圆时增加 [w] 音4. 特殊辅音 yRef连读规则 英…