从零学Java - Stream API

Java - Stream API

文章目录

  • Java - Stream API
    • 什么是流(Stream)?
    • Stream 的特点
    • Stream使用步骤
      • 1 创建 Stream流
      • 2 中间操作
      • 3 终止操作

什么是流(Stream)?

流(Stream)与集合类似,但集合中保存的是数据,而Stream中保存对集合或数组数据的操作。

在这里插入图片描述

Stream 的特点

  • Stream 自己不会存储元素。
  • Stream 不会改变源对象。相反,他们会返回一个持有结果的新Stream。
  • Stream 操作是延迟执行的,会等到需要结果的时候才执行。

Stream使用步骤

  1. 创建:新建一个流。
  2. 中间操作:在一个或多个步骤中,将初始Stream转化到另一个Stream的中间操作。
  3. 终止操作:使用一个终止操作来产生一个结果。该操作会强制之前的延迟操作立即执行,在此之后,该Stream就不能使用了。

1 创建 Stream流

代码演示:

public class TestStream1 {public static void main(String[] args) {//新建流ArrayList<String> list = new ArrayList<>();list.add("张三");list.add("张三锋");list.add("张无极");list.add("赵梦露");list.add("张黎");list.add("田美丽");//1 通过Collection对象的stream()方法(单线程)或parallelStream()方法(多线程)。list.stream().filter(s->s.startsWith("张")).forEach(System.out::println);////2 通过Arrays类的stream()方法。int[] nums = {10,2,8,1,17,24};Arrays.stream(nums).sorted().forEach(System.out::println);////3 通过Stream接口的of()、iterate()、generate()方法。Stream.of(5,3,6,13,1,8).sorted().forEach(System.out::println);////4 通过IntStream、LongStream、DoubleStream接口中的of、range、rangeClosed方法。//生成一个0~99的数组的流(含头不含尾)IntStream.range(0,100).forEach(System.out::println);//生成一个0~100的数组的流(含头含尾)IntStream.rangeClosed(0,100).forEach(System.out::println);}
}

2 中间操作

代码演示:

public class TestStream2 {public static void main(String[] args) {ArrayList<Employee> employees = new ArrayList<>();employees.add(new Employee("张三",22,18000));employees.add(new Employee("李四",23,20000));employees.add(new Employee("王五",25,22000));employees.add(new Employee("酒玖",20,25000));employees.add(new Employee("张利",22,26000));employees.add(new Employee("壮武吉",27,30000));//1  filter、limit、skip、distinct、sorted//filter 过滤employees.stream().filter(e->e.getSalary()>=25000).forEach(System.out::println);System.out.println("------------");//limit 限制employees.stream().limit(2).forEach(System.out::println);//skip 跳过指定的元素个数System.out.println("-----");employees.stream().skip(2).limit(2).forEach(System.out::println);System.out.println("-----");//distinct: 去掉重复元素 hashcode和equalsemployees.stream().distinct().forEach(System.out::println);//sorted:排序System.out.println("----------");employees.stream().sorted((e1,e2)->Double.compare(e1.getSalary(),e2.getSalary())).forEach(System.out::println);// 2 map映射System.out.println("--------map-------");//需求:遍历所有的姓名employees.stream().map(Employee::getName).forEach(System.out::println);}static class Employee{private String name;private int age;private int salary;public Employee() {}public Employee(String name, int age, int salary) {this.name = name;this.age = age;this.salary = salary;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public int getSalary() {return salary;}public void setSalary(int salary) {this.salary = salary;}@Overridepublic String toString() {return "Employee{" +"name='" + name + '\'' +", age=" + age +", salary=" + salary +'}';}}
}

3 终止操作

代码演示:

public class TestStream3 {public static void main(String[] args) {//1 forEach、min、max、countList<Integer> list=new ArrayList<>();list.add(20);list.add(18);list.add(15);list.add(22);list.add(30);//forEach 遍历元素list.stream().forEach(System.out::println);System.out.println("-------min-------");//min 最小元素//Optional: 封装元素的容器,目的避免空指针异常。Optional<Integer> optional1 = list.stream().min((o1, o2) -> o1 - o2);System.out.println(optional1.get());System.out.println("-------max-------");//min 最大元素//Optional: 封装元素的容器,目的避免空指针异常。Optional<Integer> optional2 = list.stream().max((o1, o2) -> o1 - o2);System.out.println(optional2.get());// count 元素个数System.out.println("-----count----");long count = list.stream().count();System.out.println(count);//reduce  规约,统计//统计所有元素总和System.out.println("----reduce------------");Optional<Integer> sum = list.stream().reduce((x, y) -> x + y);System.out.println(sum.get());//collect 收集//把所有的人的姓名转成List集合List<Student> students=new ArrayList<>();students.add(new Student("张三1",20,"男",100));students.add(new Student("张三2",20,"男",100));students.add(new Student("张三3",20,"男",100));students.add(new Student("张三4",20,"男",100));students.add(new Student("张三5",20,"男",100));List<String> names = students.stream().map(Student::getName).collect(Collectors.toList());System.out.println(names);}static  class Student{private String name;private int age;private String gender;private double score;public Student() {}public Student(String name, int age, String gender, double score) {this.name = name;this.age = age;this.gender = gender;this.score = score;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getGender() {return gender;}public void setGender(String gender) {this.gender = gender;}public double getScore() {return score;}public void setScore(double score) {this.score = score;}}
}

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入MySQL窗口函数:原理和应用

在现代数据库管理系统中&#xff0c;窗口函数&#xff08;Window Functions&#xff09;已经成为处理复杂数据分析任务的关键工具。MySQL从8.0版本开始引入了对窗口函数的支持&#xff0c;这极大地增强了其在数据分析和报表生成方面的能力。本文将深入探讨MySQL窗口函数的原理、…

JVM系列-4.类加载器

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring原理、JUC原理、Kafka原理、分布式技术原理、数据库技术、JVM原理&#x1f525;如果感觉博主的文…

体重管理的微观关键:脂肪组织、肠道菌群与肥胖的关联

谷禾健康 如今&#xff0c;全球约有 26 亿人&#xff08;约占世界人口的 40%&#xff09;受到超重或肥胖的影响。除非采取果断的行动来遏制这一日益严重的流行病&#xff0c;否则预计到 2035 年&#xff0c;将有超过 40 亿人&#xff0c;也就说世界人口的一半受到超重或肥胖的影…

2017年认证杯SPSSPRO杯数学建模B题(第二阶段)岁月的印记全过程文档及程序

2017年认证杯SPSSPRO杯数学建模 B题 岁月的印记 原题再现&#xff1a; 对同一个人来说&#xff0c;如果没有过改变面容的疾病、面部外伤或外科手术等经历&#xff0c;年轻和年老时的面容总有很大的相似性。人们在生活中也往往能够分辨出来两张不同年龄段的照片是不是同一个人…

数据结构Java版(4)——链表

一、概述 链表是一种常见的数据结构&#xff0c;用于存储一系列具有相同类型的数据元素。它由多个节点组成&#xff0c;每个节点包含一个数据元素和一个指向下一个节点的指针。 链表与数组不同&#xff0c;它的节点在内存中不是连续存储的&#xff0c;而是通过每个节点中的指针…

详解SpringCloud微服务技术栈:一文速通RabbitMQ,入门到实践

&#x1f468;‍&#x1f393;作者简介&#xff1a;一位大四、研0学生&#xff0c;正在努力准备大四暑假的实习 &#x1f30c;上期文章&#xff1a;详解SpringCloud微服务技术栈&#xff1a;DockerCompose部署微服务集群 &#x1f4da;订阅专栏&#xff1a;微服务技术全家桶 希…

Joern环境的安装(Windows版)

Joern环境的安装(Windows版) 网上很少有关于Windows下安装Joern的教程&#xff0c;而我最初使用也是装在Ubuntu虚拟机中&#xff0c;这样使用很占内存&#xff0c;影响体验感。在Windows下使用源码安装Joern也是非常简单的过程&#xff1a; 提前需要的本地环境&#xff1a; …

优秘智能:颠覆传统广告模式,引领数字人口播潮流,助力企业高效推广!

随着人工智能技术的飞速发展&#xff0c;AI已经渗透到我们生活的方方面面。在这个数字化时代&#xff0c;优秘智能科技有限公司凭借其强大的研发实力和创新能力&#xff0c;成功研发出一款AI数字人口播短视频制作&#xff08;制作&#xff1b;ai6ai69&#xff09;平台&#xff…

前端开发 0: 前端环境搭建

欢迎来到我即将展开的一系列博客&#xff0c;将带你踏上前端开发的奇妙之旅&#xff01;在这个数字化时代&#xff0c;前端开发成为了构建现代网页和应用程序的关键技能。无论你是刚刚入门还是已经有一些经验&#xff0c;这个系列将为你提供宝贵的知识和实用的技巧&#xff0c;…

MapReduce概述

文章目录 1. 分布式系统的驱动力和挑战2. 分布式系统的抽象和实现工具3. 可扩展性、可用性、一致性4. MapReduce基本工作方式5. Map函数和Reduce函数 1. 分布式系统的驱动力和挑战 分布式系统的核心是通过网络来协调&#xff0c;共同完成一致任务的一些计算机。构建分布式系统…

实现VLAN之间的路由

原理&#xff1a;路由器子接口 一个接口允许多个VLAN通过&#xff08;避免占用物理路由器接口&#xff09;。 目标 第 1 部分&#xff1a;单臂路由 第 2 部分&#xff1a;配置第三层交换机的路由端口 第 3 部分&#xff1a;带SVI的VLAN间路由 第 4 部分&#xff1a;补充知…

SpikingJelly笔记之IFLIF神经元

文章目录 前言一、脉冲神经元二、IF神经元1、神经元模型2、神经元仿真 三、LIF神经元1、神经元模型2、神经元仿真 总结 前言 记录整合发放(integrate-and-fire, IF)神经元与漏电整合发放(leaky integrate-and-fire, LIF)神经元模型&#xff0c;以及在SpikingJelly中的实现方法…