首页 > 其他分享 >6、Stream

6、Stream

时间:2023-06-12 15:15:28浏览次数:34  
标签:Stream name stream names 数组 new

1、介绍

目的:用于简化集合和数组操作的 API,结合了 Lambda 表达式
Stream 流思想的核心

  • 先得到集合或者数组的 Stream 流(就是一根传送带)
  • 把元素放上去
  • 然后就用这个 Stream 流简化的 API 来方便的操作元素
List<String> names = new ArrayList<>();
Collections.addAll(names, "张无忌", "周芷若", "赵敏", "张强", "张三丰");

names.stream()
    .filter(name -> name.startsWith("张"))
    .filter(name -> name.length() == 3)
    .forEach(System.out::println);

Stream 流的三类方法

  • 获取 Stream 流:创建一条流水线,并把数据放到流水线上准备进行操作
  • 中间方法:流水线上的操作,一次操作完毕之后,还可以继续进行其他操作
  • 终结方法:一个 Stream 流只能有一个终结方法,是流水线上的最后一个操作

2、获取 Stream 流

Stream 操作集合或者数组的第一步是先得到 Stream 流,然后才能使用流的功能
集合获取 Stream 流的方式:可以使用 Collection 接口中的默认方法 stream() 生成流

方法名 说明
default Stream<E> stream() 获取当前集合对象的 Stream 流
Map<String, Integer> map = new HashMap<>();

Set<String> keySet = map.keySet();
Stream<String> keyStream = keySet.stream();

Collection<Integer> values = map.values();
Stream<Integer> valuesStream = values.stream();

Set<Map.Entry<String, Integer>> entries = map.entrySet();
Stream<Map.Entry<String, Integer>> entryStream = entries.stream();

数组获取 Stream 流的方式

方法名 说明
public static <T> Stream<T> stream(T[] array) 获取当前数组的 Stream 流(Arrays 的 API)
public static <T> Stream<T> of(T... values) 获取当前数组 / 可变数据的 Stream 流(Stream 的 API)
String[] names = {"张三", "李四", "王五"};

Stream<String> stringStream = Arrays.stream(names);

Stream<String> nameStream = Stream.of(names);

3、中间方法

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

名称 说明
static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b) 合并 a 和 b 两个流为一个流
Stream<T> filter(Predicate<? super T> predicate) 用于对流中的数据进行过滤
<R> Stream<R> map(Function<? super T, ? extends R> mapper) 对流中的每个元素进行加工(Function<元素类型, 加工后的类型>)
Stream<T> limit(long maxSize) 获取前几个元素
Stream<T> skip(long n) 跳过前几个元素
Stream<T> distinct() 去除流中重复的元素,依赖 hashCode 和 equals 方法
Stream<T> sorted(Comparator<? super T> comparator) 根据比较器规则对流中元素进行排序
names.stream().map(new Function<String, String>() {
    @Override
    public String apply(String name) {
        return "亲爱的".concat(name);
    }
}).forEach(System.out::println);

注意:中间方法会返回新的流,原来的流就不能用了,流只能使用一次

Stream<String> stringStream = names.stream();

stringStream.filter(name -> name.startsWith("张")); // 会返回新的流, 但是这里并没有接收新的流对象

stringStream.forEach(System.out::println);          // 原来的流已经不能用了, 这里会报错
// IllegalStateException: stream has already been operated upon or closed

4、终结方法

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

名称 说明
void forEach(Consumer<? super T> action) 对此流的每个元素执行遍历操作
long count() 返回此流中的元素数
Optional<T> max(Comparator<? super T> comparator) 根据比较器规则获取流中元素的最大值
public T get() 获取元素(Optional 的 API)

5、收集 Stream 流

就是把 Stream 流操作后的结果数据恢复到集合或者数组中去
Stream 流:方便操作集合 / 数组的手段
集合 / 数组:才是开发中的目的

名称 说明
R collect(Collector collector) 开始收集 Stream 流,指定收集器(集合)
Object[] toArray() 开始收集 Stream 流,结果为 Object 数组
<A> A[] toArray(IntFunction<A[]> generator) 开始收集 Stream 流,结果为指定类型数组

Collectors 工具类提供了具体的收集方式

方法名 说明
public static <T> Collector toList() 把元素收集到 List 集合中
public static <T> Collector toSet() 把元素收集到 Set 集合中
public static Collector toMap(Function keyMapper, Function valueMapper) 把元素收集到 Map 集合中
Object[] objects = names.stream().toArray(); // Object 数组

String[] strings = names.stream().toArray(new IntFunction<String[]>() {
    @Override
    public String[] apply(int length) {
        return new String[length];
    }
});
//String[] strings = names.stream().toArray(String[]::new); 指定类型数组

List<String> result = names.stream().filter(name -> name.length() == 3).collect(Collectors.toList()); // 把元素收集到 List 集合中
System.out.println(result);

// 把元素收集到 Map 集合中
List<UserInfo> userInfoList = userService.batchGetUserInfoByUserIds(userIdList);
Map<Long, UserInfo> userInfoMap = userInfoList.stream().collect(Collectors.toMap(UserInfo::getUserId, userInfo -> userInfo));

6、加工演示

// 需求: 把 names 列表转为 Student 数组
public class Student {
    private String name;
}

List<String> names = new ArrayList<>();
Collections.addAll(names, "张无忌", "周芷若", "赵敏", "张强", "张三丰");
// 方式一
List<Student> students = new ArrayList<>();
names.stream().map(new Function<String, Student>() {
    @Override
    public Student apply(String name) {
        return new Student(name);
    }
}).forEach(student -> students.add(student));
System.out.println(students);
// names.stream().map(name -> new Student(name)).forEach(student -> students.add(student));
// names.stream().map(Student::new).forEach(students::add);

// 方式二
List<Student> studentList = names.stream().map(Student::new).collect(Collectors.toList());
System.out.println(studentList);

标签:Stream,name,stream,names,数组,new
From: https://www.cnblogs.com/lidong422339/p/17475046.html

相关文章

  • JavaStream LIst转map
    publicstaticvoidmain(String[]args){List<TarKoc>tarKocs=newArrayList<>();tarKocs.add(newTarKoc().setId(1).setKName("aaa"));tarKocs.add(newTarKoc().setId(2).setKName("bb"));t......
  • Java8新特性Stream之list转map及问题解决
    List集合转Map,用到的是Stream中Collectors的toMap方法:Collectors.toMap具体用法实例如下://声明一个List集合Listlist=newArrayList();list.add(newPerson("1001","小A"));list.add(newPerson("1002","小B"));list.add(......
  • mediastream.c的一些说明
    mediastream.c的一些说明/*************************//*   mediastream.c的一些说明  *//*                                          *//*         author:atomchan    *//*     ......
  • streamlit app.py 如何配置一个schedule 定时任务
    streamlitapp.py如何配置一个schedule定时任务Streamlit是一个用于构建数据应用程序的Python框架,它本身不支持定时任务的调度功能。但是,可以使用Python中的第三方库schedule来实现这个功能。schedule是一个轻量级的Python库,用于在指定的时间间隔内运行重复任务。要......
  • Redis系列15:使用Stream实现消息队列(精讲)
    Redis系列1:深刻理解高性能Redis的本质Redis系列2:数据持久化提高可用性Redis系列3:高可用之主从架构Redis系列4:高可用之Sentinel(哨兵模式)Redis系列5:深入分析Cluster集群模式追求性能极致:Redis6.0的多线程模型追求性能极致:客户端缓存带来的革命Redis系列8:Bitmap实现亿万级......
  • GStreamer
    overview​ gstreamer是一个支持Windows,Linux,Android,iOS的跨平台的多媒体框架。​ 本文和后续关于gstreamer的开发环境(只针对ubuntu,其他平台参考官方文档):​ ubuntu20.04.1focalAPI​ GstBus(gstreamer.freedesktop.org)安装环境官方安装教程:InstallingonLinux(gstr......
  • IO流 p9 转换流-InputStreamReader 和 OutputStreamWriter
    转换流-InputStreamReader和OutputStreamWriter介绍InputStreamReader:Reader的子类,可以将InputStream(字节流)包装成Reader(字符流);OutputStreamWriter:Writer的子类,实现将OutputStream(字节流)包装成Writer(字符流);当处理纯文本数据时,如果使用字符流效率更高,并且可以有效解决中文......
  • C# MemoryStream转GZipStream 到文件
    压缩:publicstaticvoidMemoryStreamCompress(stringfileName,MemoryStreammemStream){FileStreamfsWrite=File.OpenWrite(fileName);byte[]bytes=newbyte[1*1024*1024];GZipStreamcompressedzipStream=......
  • p6 BufferedInputStream 和 BufferedOutputStream
    BufferedInputStream和BufferedOutputStreamBufferedInputStreamBufferedInputStream是字节流,在创建BufferedInputStream时,会创建一个内部缓冲区数组。构造方法摘要ConstructorandDescriptionBufferedInputStream(InputStreamin)创建一个BufferedInputStr......
  • centos8在更新yum源时提示失败 错误:为 repo ‘AppStream’下载元数据失败
    https://blog.csdn.net/Remberthename/article/details/124070710 centos8在更新yum源时提示失败错误:为repo'AppStream’下载元数据失败解决方法:原因:因原有系统中使用的镜像访问地址在国内访问过慢导致解决方案:1、将目录切换到/etc/yum.repos.d目录下2、修改CentOS-......