Java中Stream流

server/2024/9/24 5:27:02/

Java中Stream流

Stream

使用flatMap处理嵌套集合:
有一个对象列表,每个对象又包含一个列表,可以使用flatMap来“展平”这个结构。

java">List<List<String>> listOfLists = Arrays.asList(Arrays.asList("a", "b"),Arrays.asList("c", "d")
);
List<String> flatList = listOfLists.stream().flatMap(List::stream).collect(Collectors.toList());

使用peek进行调试:
peek方法可以在流的中间操作中插入一个动作,比如打印日志,而不会影响流的最终结果。

java">List<String> result = list.stream().filter(s -> s.startsWith("a")).peek(System.out::println) // 打印中间结果.map(String::toUpperCase).collect(Collectors.toList());

peek可以用来调试也可以塞对象,不改变流,如果你这个里面有对象,比如xxx.setXXX() 那么也会修改这个对象

使用groupingBy进行分组:
Collectors.groupingBy可以根据某个属性对元素进行分组。

java">Map<Integer, List<String>> map = list.stream().collect(Collectors.groupingBy(String::length));

使用reduce进行复杂聚合:
reduce方法可以用来执行更复杂的聚合操作,比如连接字符串。

java">String joined = list.stream().reduce("", (a, b) -> a + ", " + b);

使用IntStreamLongStreamDoubleStream进行基本类型操作

对于基本数据类型(int、long、double),可以使用IntStreamLongStreamDoubleStream来提高性能和内存使用效率。

java">int sum = IntStream.of(1, 2, 3, 4, 5).sum();

使用Stream.generateStream.iterate生成无限流

Stream.generate可以用来创建一个无限流,其中每个元素都是通过一个Supplier函数生成的。

java">Stream<Double> randoms = Stream.generate(Math::random);

Stream.iterate可以用来创建一个无限流,其中每个元素都是基于前一个元素计算得到的。

java">Stream<Integer> naturals = Stream.iterate(0, n -> n + 1);

使用Stream.collect的自定义收集器

collect方法非常灵活,可以配合自定义的Collector来实现复杂的收集逻辑。

java">Collector<T, ?, LinkedList<T>> toLinkedList = Collector.of(LinkedList::new,LinkedList::add,(left, right) -> { left.addAll(right); return left; }
);
List<T> linkedListOfT = stream.collect(toLinkedList);

使用Stream.concat合并两个流

Stream.concat方法可以用来合并两个流。

java">Stream<String> stream1 = Stream.of("a", "b", "c");
Stream<String> stream2 = Stream.of("d", "e", "f");
Stream<String> combined = Stream.concat(stream1, stream2);

使用Stream.peek进行调试

peek方法可以在流的处理过程中插入一个操作,用于调试。

java">List<String> result = list.stream().filter(s -> s.startsWith("a")).peek(System.out::println) // 打印中间结果.map(String::toUpperCase).collect(Collectors.toList());

使用Stream.anyMatch, Stream.allMatch, 和 Stream.noneMatch

这三个方法用于对流中的元素进行断言检查。

java">boolean anyStartsWithA = list.stream().anyMatch(s -> s.startsWith("a"));
boolean allStartsWithA = list.stream().allMatch(s -> s.startsWith("a"));
boolean noneStartsWithZ = list.stream().noneMatch(s -> s.startsWith("z"));

使用Stream.ofNullable处理可能为null的元素

Stream.ofNullable可以用来创建一个元素可能为null的流。

java">Stream<String> stream = Stream.ofNullable(getNullableValue());

使用flatMap处理多层嵌套结构

当处理多层嵌套的集合时,flatMap可以用来将多层结构“展平”成单个流。

java">Stream<List<List<String>>> nestedLists = Stream.of(listOfLists);
Stream<String> flatStream = nestedLists.flatMap(List::stream).flatMap(List::stream);

Optional

  1. 使用orElseGet延迟加载:
    orElseGet提供一个Supplier函数,只有在Optional为空时才调用。

    java">Optional<String> optional = Optional.ofNullable(getValue());
    String value = optional.orElseGet(() -> computeValue());
    
  2. 使用maporElse链式处理:
    map可以用来转换Optional中的值,如果Optional为空,则可以使用orElse提供默认值。

    java">String result = optional.map(String::toUpperCase).orElse("DEFAULT");
    
  3. 使用filter进行条件过滤:
    filter方法可以用来检查Optional中的值是否满足特定条件。

    java">Optional<String> filtered = optional.filter(s -> s.length() > 5);
    
  4. 使用ifPresent执行操作:
    如果Optional中有值,ifPresent执行一个操作。

    java">optional.ifPresent(System.out::println);
    
  5. 使用stream方法:
    Optional类有一个stream方法,可以将Optional转换为Stream,这样就可以使用Stream API进行进一步处理。

    java">optional.stream().map(String::toUpperCase).forEach(System.out::println);
    

http://www.ppmy.cn/server/99775.html

相关文章

ffmpeg重采样

ffmpeg重采样指的是可以将一个固定频率的音频转换为任意格式的音频&#xff0c;比如改变音频的采样率或者声道&#xff0c;这种操作简称为重采样。但是在重采样的过程中也会有一些数据丢失的过程&#xff0c;主要原因是在采样会会进行向上对齐&#xff0c;所以会出现转换后大小…

k8s分布式存储-ceph

文章目录 Cephdeploy-ceph部署1.系统环境初始化1.1 修改主机名&#xff0c;DNS解析1.2 时间同步1.3 配置apt基础源与ceph源1.4关闭selinux与防火墙1.5 **创建** ceph **集群部署用户** cephadmin1.6分发密钥 2. ceph部署2.1 **安装** ceph 部署工具2.2 **初始化** mon **节点**…

string的模拟实现

1.string.h代码 #pragma once #include<assert.h> namespace myh {class string{friend ostream& operator<<(ostream& _cout, const myh::string& s);friend istream& operator>>(istream& _cin, myh::string& s);public:typedef …

apache几个重要概念和处理应对状态码的一些方法

一、apache几个重要概念 Apache 是一款开源 Web 服务器软件&#xff0c;在Web服务器&#xff08;如Apache HTTP Server&#xff09;和软件开发中&#xff0c;高度模块化、DSO&#xff08;Dynamic Shared Object&#xff09;和MPM&#xff08;Multi-Processing Module&#xff…

数据库逻辑删除时查询为什么不可用用like来进行查询?它们之间有什么转换吗?

1.首先可以查询我们的数据库字段&#xff0c;我们这里使用的是< bit(1) > 即只能存储一位&#xff0c;也只能是0或者1 2.在数据库操作中也被是涉及到逻辑删除时&#xff08;即使用某个字段来标识记录是否被删除&#xff0c;而不是从数据库中移除记录&#xff09;&#x…

【数据结构】五、树:6.平衡二叉树AVL

2.平衡二叉树AVL 文章目录 2.平衡二叉树AVL2.1定义2.2存储结构2.3查找2.4插入&#xff08;保持平衡&#xff09;2.4.1 LL平衡旋转(右单旋转)2.4.2 RR平衡旋转(左单旋转)2.4.3 LR平衡旋转(先左后右双旋转)2.4.4 RL平衡旋转(先右后左双旋转)2.4.5题解 2.5性能分析2.6删除 2.1定义…

http的发展历史,各版本的差异点,以及和https的区别

### HTTP的发展历史及各版本的差异点 HTTP/0.9 - **发布时间**&#xff1a;1991年 - **特点**&#xff1a; - 最初的HTTP协议版本&#xff0c;非常简单。 - 只支持GET方法&#xff0c;不支持请求头和响应头。 - 响应仅为纯文本&#xff0c;无法传输图片、音频等多媒体资…

llama factory 训练 TensorBoard 可视化

首先需要在 yaml 里设置两个参数&#xff1a; output_dir: /home/wangguisen/projects/LLaMA-Factory/weights/tensbox_demoreport_to: tensorboard logging_dir: /home/wangguisen/projects/LLaMA-Factory/weights/tensbox_demo/runs然后开始训练&#xff0c;在你的输出目录下…