设为首页 加入收藏

TOP

Stream流体系(一)
2023-07-25 21:22:38 】 浏览:72
Tags:Stream

视频地址https://www.bilibili.com/video/BV1Cv411372m?

1 Stream流概述

  • 目的:简化集合和数组操作的API,结合了Lambda表达式。

  • Stream流式思想的核心:

    1. 先得到集合或者数组的Stream流(就是一根传送带)
    2. 把元素放上去
    3. 用这个Stream流简化的API来方便的操作元素

2 Stream流获取

  1. Stream流的三类方法:
  • 获取Stream流
    • 创建一条流水线,并把数据放到流水线上准备进行操作。
  • 中间方法
    • 流水线上的操作。一次操作完毕之后,还可以继续进行其他操作。
  • 终结方法
    • 一个Stream流只能有一个终结方法,是流水线上的最后一个操作。
  1. Stream操作集合或者数组的第一步是先得到Stream流,然后才能使用流的功能。
  • 集合获取Stream流的方式
    使用Collection接口中的默认方法stream()生成流
    image
	/***Collection集合获取流********/
	Collection<String> list  = new ArrayList<>();
	Stream<String> s = list.stream();

	/*** Map集合获取流*/
	Map<String,Integer> maps = new HashMap<>();
	//键流
	Stream<String> keyStream = maps.keySet().stream();
	// 值流
	Stream<Integer> valueStream = maps.values().stream();
	//键值对流(拿整体)
	Stream<Map.Entry<String, Integer>> keyAndValueStream = maps.entrySet().stream();
  • 数组获取Stream流的方式
    image
	/**数组获取流****/
	String[] names = {"张三","李四","王五","范二"};
	Stream<String> nameStream = Arrays.stream(names);
	Stream<String> nameStream2 = Stream.of(names);

3 Stream流的常用API

3-1 中间操作方法

image
注意:

  • 中间方法也称为非终结方法,调用完成后返回的新的Stream流可以继续使用,支持链式编程。
  • 在Stream流中无法直接修改集合、数组中的数据。

示例

  1. 过滤:查找出以"张"开头的人的名字
list.stream().filter(s->s.startsWith("张")).forEach(s-> System.out.println(s));
  1. 统计字符串长度为3的蒜素个数
long size = list.stream().filter(s -> s.length() == 3).count();
  1. limit获取前几个元素

forEach(s -> System.out.println(s)
当s和sout内的s是相同元素时,可以简写成System.out::println
filter代表开始过滤,->代表开始过滤,

list.stream().filter(s -> s.startsWith("张")).limit(2).forEach(s -> System.out.println(s));
list.stream().filter(s -> s.startsWith("张")).limit(2).forEach(System.out::println);
  1. skip跳过前几个元素
list.stream().filter(s -> s.startsWith("张")).skip(2).forEach(System.out::println);
  1. Map:加工方法 :第一个方法为原材料,第二个参数是加工后的结果
  • 给集合元素前面都加上一个前缀xxx
list.stream().map(s -> "xxxx"+s).forEach(System.out::println);
  • 把所有名字都加工成一个学生对象
2为1的简写
1、list.stream().map(s -> new Student(s)).forEach(System.out::println);
2、list.stream().map(Student::new).forEach(System.out::println);
  1. 合并流
//public static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)
//两个不同流合并,例如流1是String类型,流2是Integer类型,此时合并后的流需要是流1和流2的父类,即父类可以接收子类
Stream<String> s1 = list.stream().filter(s -> s.startsWith("张"));
Stream<String> s2 = Stream.of("Java1","Java2");
Stream<String> s3 = Stream.concat(s1,s2);
s3.distinct().forEach(System.out::println);

3-2 终结操作方法

image
注意:终结操作方法,调用完成后流就无法继续使用了,原因是不会返回Stream了。

4 Stream流的综合应用

image

  1. 新建一个类存储员工信息
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee {
    private String name;
    private char sex;
    private double salary;
    private double bonus;
    private String punish; //处罚信息
}
  1. 定义两个集合,并向集合中添加元素
List<Employee> one = new ArrayList<>();
one.add(new Employee("猪八戒",'男',30000,25000,null));
one.add(new Employee("孙悟空",'男',25000,1000,"迟到&
首页 上一页 1 2 3 4 下一页 尾页 1/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇如何用chatGPT快速开发java后端功.. 下一篇如何通过Java代码将 PDF文档转为 ..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目