第7章-第9节-Java中的Stream流(链式调用)

1、什么是Stream流

Lambda表达式,基于Lambda所带来的函数式编程,又引入了一个全新的Stream概念,用于解决集合类库既有的鼻端。

2、案例

假设现在有一个需求, 将list集合中姓张的元素过滤到一个新的集合中;然后将过滤出来的姓张的元素中,再过滤出来长度为3的元素,存储到一个新的集合中

// 已知的知识来解决需求
List<String> list1 = new ArrayList<>();
list1.add("张老三");
list1.add("张小三");
list1.add("李四");
list1.add("赵五");
list1.add("张六");
list1.add("王八");
 
ArrayList<String> list2 = new ArrayList<>();
// 1.将list集合中姓张的元素过滤到一个新的集合中
for(String name : list1){
    if(name.startsWith("张")){
    list2.add(name);
    }
}
ArrayList list3 = new ArrayList();
for (String name : list2) {
    if (name.length() == 3){
        list3.add(name);
    }
}
System.out.println(list3);

很麻烦,不是吗,同样我们需要更加简洁优雅的方式实现 (链式调用)

3、 Stream流

list1.stream().filter((String name)->name.startsWith("张")).filter((String name)->name.length()==3).forEach((String name)->{
    System.out.println("符合条件的姓名:" + name);
});

4、获取流的方式

Stream<String> stream1 = list.stream();
Stream<String> stream2 = set.stream();
 //根据Map集合的键获取流
Set<Integer> map1 = map.keySet();
Stream<Integer> stream3 = map1.stream();
//根据Map集合的值获取流
Collection<String> map2 = map.values();
Stream<String> stream4 = map2.stream();
//根据Map集合的键值对对象获取瑞
Set<Map.Entry<Integer, String>> map3 = map.entrySet();
Stream<Map.Entry<Integer, String>> stream5 = map3.stream();
// 根据数组获取流
String[] arr = {"张颜宇","张三","李四","赵五","刘六","王七"};
Stream<String> stream6 = Stream.of(arr);

5、Stream流的常用方法

1)、count方法

List<String> list = new ArrayList<>();
        list.add("张老三");
        list.add("张小三");
        list.add("李四");
        list.add("赵五");
        list.add("张六");
        list.add("王八");
 
        long count = list.stream().count();
        System.out.println("集合中的元素个数是:" + count);
 
        //输出结果:
        //集合中的元素个数是:6

2)、filter 方法

// 获取stream流
Stream<String> stream = Stream.of("张老三", "张小三", "李四", "赵五", "刘六", "王七");
// 需求:过去出姓张的元素
stream.filter((String name)->{
    return name.startsWith("张");
}).forEach((String name)->{
    System.out.println("流中的元素" + name);
});

3)、foreach 方法

List<String> list = new ArrayList<>();
list.add("张老三");
list.add("张小三");
list.add("李四");
list.add("赵五");
list.add("张六");
list.add("王八");
 
// 函数模型:获取流 --> 注意消费流中的元素
list.stream().forEach((String name)->{
    System.out.println(name);
});

4)、limit方法

// 获取流的长度
Stream<String> stream1 = Stream.of("张老三", "张小三", "李四", "赵五", "刘六", "王七");
// 需求:保留前三个元素
stream1.limit(3).forEach((String name)->{
    System.out.println("流中的前三个元素是:" + name);
});

5)、map方法

//基本类型转换    
// 获取Stream流
Stream<String> stream1 = Stream.of("11","22","33","44","55");
// 需求:把stream1流中的元素转换为int类型
stream1.map((String s)->{
    return Integer.parseInt(s); // 将String类型的s进行转换为Integer类型的元素,并返回
}).forEach((Integer i)->{
    System.out.println(i);  // 将转换后的int类型的元素逐一输出
});
//大写转换收集
List list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("orange");
Stream stream = list.stream().map(s -> s.toUpperCase());
stream.forEach(System.out::println);
//元素计算收集
List list = Arrays.asList(1, 2, 3, 4, 5);
List resultList = list.stream().map(x -> x * x).collect(Collectors.toList());
System.out.println(resultList);
//引用数据类型属性收集
List people = new ArrayList<>();
people.add(new Person("Tom", 18));
people.add(new Person("Jerry", 20));
List result = people.stream().map(Person::getName).collect(Collectors.toList());
System.out.println(result);
//实体类map类型收集
List people = new ArrayList<>();
people.add(new Person("Tom", 18));
people.add(new Person("Jerry", 20));
Map result = people.stream().collect(Collectors.toMap(Person::getName, Person::getAge));
System.out.println(result);

6)、skip方法

// 获取stream流
Stream<String> stream = Stream.of("张老三", "张小三", "李四", "赵五", "刘六", "王七");
stream.skip(3).forEach((String name)->{
    System.out.println("跳过前三个,打印剩下的" + name);
});

7)、concat方法

Stream<String> stream1 = Stream.of("11","22","33","44","55");
Stream<String> stream2 = Stream.of("张颜宇", "张三", "李四", "赵五", "刘六", "王七");
// 需求:合并两个流
Stream<String> stream = Stream.concat(stream1,stream2);
stream.forEach((String name)->{
    System.out.print(name);
});

 8)、收集Stream流方法

List<String> list2 = new ArrayList<>();
list2.add("张老三");
list2.add("张小三");
list2.add("李四");
list2.add("赵五");
list2.add("张六");
list2.add("王八");
 
// 需求:过滤出姓张的并且长度为3的元素
Stream<String> stream = list2.stream().filter((String name) -> {
    return name.startsWith("张");
}).filter((String name) -> {
    return name.length() == 3;
});
 
// stream 收集到单列集合中
List<String> list = stream.collect(Collectors.toList());
System.out.println(list);
 
// stream 收集到单列集合中
Set<String> set = stream.collect(Collectors.toSet());
System.out.println(set);
public class StreamTest {
    public static void main(String[] args) {
        List<String> names = new ArrayList<>();
        //Collections.addAll();
        Collections.addAll(names,"张三丰","张无忌","李四","王五","李娜","吴彦祖");
//        System.out.println(names);

//        for (String s:names) {
//            //打印所有姓张的
//            if(s.startsWith("张")){
//                System.out.println(s);
//            }
//            //打印出所有名字长度是3的
//            if(s.length()==3){
//                System.out.println(s);
//            }
//        }

        //Stream 流实现集合过滤
        //1. 通过集合获取流
        Stream<String> s1 = names.stream();
        //2. 过滤器 filter  遍历器  foreach
        //过滤出所有姓张的姓名
//        s1.filter((String name) -> name.startsWith("张"))
//                .forEach((String name) -> {
//                    System.out.println(name);
//                });

        //limit(X) 取前X个数据
        Stream<String> stm2 = Stream.of("张小毛","赵本山","吴亦凡","曹孟德","刘备","李斯");
//        stm2.limit(3).forEach((String s) -> System.out.println(s));

        //skip(X) 跳过X个数据,打印剩下的
//        stm2.skip(3).forEach((String s) -> System.out.println(s));

        //concat(流1,流2) 合并流1和流2 (泛型最好相同)
        Stream<String> stream3 = Stream.of("11","22","33","44","55");
        //合并两个流存到stmAll中
//        Stream<String>stmAll = Stream.concat(stm2,stream3);
//        stmAll.forEach((String s) -> System.out.println(s));

        //map 映射
//        stream3.map((String n) -> {
//            return Integer.parseInt(n);
//        }).forEach((Integer num)-> System.out.println(num));

//        stream3.map((String number) -> {
//            number = "100";
//            return number;
//        }).forEach((String n) -> System.out.println(n));

        Stream<String> stm4 = Stream.of("张小毛","赵本山","吴亦凡","曹孟德","刘备","李斯");
        //挑选出3个字名字,并且存入一个List中
        List ss = stm4.filter((String name) ->
             name.length() == 3
        ).collect(Collectors.toList()); //collect收集方法:将过滤出来的数据转为集合
                                        //Collectors.toList()转为什么集合toList List集合
        //关闭
        stm4.close();

        System.out.println(ss);




//        AtomicInteger sum = new AtomicInteger();
//        AtomicInteger sum_mew = new AtomicInteger();
//        stream3.map((String n) -> {
//        sum.set(Integer.parseInt(n) + sum.get());
//        return sum;
//        }).forEach((AtomicInteger num)-> {
//            sum_mew.set(num.get());
//        });
//        System.out.println("总和为:"+sum_mew);

    }
}

9)、Stream流的reduce方法

//利用reduce方法快捷运算
List numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream().reduce((a, b) -> a + b).get();
System.out.println(sum);

本电子书目录:《Java基础的重点知识点全集》

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

做科技类的展台3d模型用什么材质比较好---模大狮模型网

对于科技类展台3D模型&#xff0c;以下是几种常用的材质选择&#xff1a; 金属材质&#xff1a;金属材质常用于科技展台的现代感设计&#xff0c;如不锈钢、铝合金或镀铬材质。金属材质可以赋予展台一个科技感和高档感&#xff0c;同时还可以反射光线&#xff0c;增加模型的真实…

Verilog 高级教程笔记——持续更新中

Verilog advanced tutorial 转换函数 调用系统任务任务描述int_val $rtoi( real_val ) ;实数 real_val 转换为整数 int_val 例如 3.14 -> 3real_val $itor( int_val ) ;整数 int_vla 转换为实数 real_val 例如 3 -> 3.0vec_val $realtobits( real_val ) ;实数转换为…

jquery 合并table表格行或列

合并行 $("#tableId").find("tr").each(function(rowIndex) {var cells $(this).find("td");cells.each(function(cellIndex) {var cell $(this);var prevRowCell table.find("tr:eq(" (rowIndex - 1) ")").find(&quo…

有关“修改地址”的回复话术大全

类型一:不能改地址 1.亲非常抱歉 这边发货后客服就没法帮您操作修改地址了 2.非常遗憾&#xff0c;订单一旦下单完成 地址是无法进行修改的。如果您这边需要修改地址的话也是可以尝试去和这个物流方进行协商的哦&#xff0c;这边没有修改的按钮没法操作的 3.抱歉呢亲亲。修改…

【C语言题解】 | 101. 对称二叉树

101. 对称二叉树 101. 对称二叉树代码 101. 对称二叉树 这个题目要求判断该二叉树是否为对称二叉树&#xff0c;此题与上一题&#xff0c;即 100. 相同的树 这个题有异曲同工之妙&#xff0c;故此题可借鉴上题。 我们先传入需要判断二叉树的根节点&#xff0c;通过isSameTree()…

Java设计模式-访问者模式

访问者模式 一、概述二、结构三、案例实现四、优缺点五、使用场景六、扩展 一、概述 定义&#xff1a; 封装一些作用于某种数据结构中的各元素的操作&#xff0c;它可以在不改变这个数据结构的前提下定义作用于这些元素的新的操作。 二、结构 访问者模式包含以下主要角色: …

【JAVA】Java8开始ConcurrentHashMap,为什么舍弃分段锁

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a; JAVA ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 分段锁的好处&#xff1a; 结语 我的其他博客 前言 在Java 8中&#xff0c;ConcurrentHashMap的实现经历了重大的改进&am…

Visual Studio 2017 + opencv4.6 + contribute + Cmake(Aruco配置版本)指南

之前配置过一次这个&#xff0c;想起这玩意就难受&#xff0c;贼难配置。由于要用到里面的一个库&#xff0c;不得已再进行配置。看网上的博客是真的难受&#xff0c;这写一块&#xff0c;那里写一块&#xff0c;乱七八糟&#xff0c;配置一顿发现写的都是错的&#xff0c;还得…

【Python学习】Python学习10-列表

目录 【Python学习】Python学习10-列表 前言创建语法访问列表中的值更新和删除列表元素操作列表列表截取Python列表函数&方法参考 文章所属专区 Python学习 前言 本章节主要说明Python的列表List。 创建语法 创建一个列表 通过方括号和逗号分割创建&#xff0c;列表数据…

一个大场景下无线通信仿真架构思路(对比omnet与训练靶场)

2020年分析过omnet的源码&#xff0c;读了整整一年&#xff0c;读完之后收获不小&#xff0c;但是也遗憾的发现这个东西只适合实验室做研究的人用于协议的研发与测试&#xff0c;并不适合大场景&#xff08;军事游戏等&#xff09;的应用&#xff0c;因为其固有架构更侧重于每个…

视频号小店和抖音小店相比,新手做哪个比较好?

我是电商珠珠 抖音小店在19年被抖音所发展&#xff0c;在这过程中&#xff0c;抖音小店通过自身的不断完善&#xff0c;从兴趣电商到全域兴趣电商模式&#xff0c;从直播电商到商城的出现&#xff0c;凭借着门槛低流量高的优势&#xff0c;让很多商家尝到了红利。 尤其是在20…

1042: 数列求和3 和 1057: 素数判定 和 1063: 最大公约与最小公倍

1042: 数列求和3 题目描述 求1-2/33/5-4/75/9-6/11...的前n项和&#xff0c;结果保留3位小数。 输入 输入正整数n(n>0)。 输出 输出一个实数&#xff0c;保留3位小数&#xff0c;单独占一行。 样例输入 5 样例输出 0.917 #include<stdio.h> int main(){in…

归并排序-排序算法

前言 如果一个数组的左右区间都有序&#xff0c;我们可以使用一种方法&#xff08;归并&#xff09;&#xff0c;使这个数组变得有序。 如下图&#xff1a; 过程也很简单&#xff0c;分别取左右区间中的最小元素&#xff0c;再把其中较小的元素放到临时数组中&#xff0c;例如…

JavaSE学习笔记 2023-12-28 --MySQL

MySQL 个人整理非商业用途&#xff0c;欢迎探讨与指正&#xff01;&#xff01; 文章目录 MySQL1.数据库介绍2.数据库的分类3.数据库中的常用术语4.数据库安装和配置5.MySQL的逻辑结构6.SQL语句7.DML7.1DQL7.1.1基本查询7.1.2过滤查询7.1.2.1条件运算符7.1.2.2逻辑运算符7.1.2.…

Spring 基于注解的AOP见解4

5.基于注解的AOP配置 5.1创建工程 5.1.1.pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&…

【AI视野·今日NLP 自然语言处理论文速览 第六十七期】Mon, 1 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Mon, 1 Jan 2024 Totally 42 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Principled Gradient-based Markov Chain Monte Carlo for Text Generation Authors Li Du, Afra Amini, Lucas…

基于Springboot的计算机学院校友网(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的计算机学院校友网(有报告)。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring…

红队打靶练习:RICKDICULOUSLYEASY: 1

目录 信息收集 1、arp 2、nmap 3、nikto 4、whatweb 目录探测 gobuster dirsearch WEB get flag1 /robots.txt FTP get flag2 telenet登录 get flag3 get flag4 9090端口 get flag5 dirsearch ssh登录 Summer用户 get flag6 信息收集 get flag7 get fl…

目标检测数据集大全「包含VOC+COCO+YOLO三种格式+划分脚本+训练脚本」(持续原地更新)

一、作者介绍&#xff1a;五年算法开发经验、AI 算法经理、阿里云开发社区专家博主、稀土掘金人工智能内容评审委员会成员。擅长&#xff1a;检测、分割、理解、AIGC 等算法训练与部署。 二、数据集介绍&#xff1a; 质量高&#xff1a;高质量图片、高质量标注数据&#xff0c;…

Java中什么序列化?

在Java中&#xff0c;序列化是一种将对象转换为字节序列的机制&#xff0c;使得对象可以在网络上传输或存储到文件中&#xff0c;而后可以通过反序列化还原为对象。Java提供了java.io.Serializable接口&#xff0c;通过实现这个接口的类可以实现对象的序列化和反序列化。 序列…