Java中Stream流

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);

使用IntStream、LongStream和DoubleStream进行基本类型操作

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

java 复制代码
int sum = IntStream.of(1, 2, 3, 4, 5).sum();

使用Stream.generate和Stream.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. 使用map和orElse链式处理 :
    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);
相关推荐
VidDown3 小时前
24fps 转 25fps 不只是改个数字:帧率转换、PAL/NTSC 与音频补偿
python·网络协议·音视频·视频编解码·视频
蛋蛋的就会顺顺的3 小时前
hot100 p0——栈,贪心算法,动态规划
java·前端·javascript·算法·leetcode·力扣
需要8264 小时前
Spring Bean 生命周期:从实例化到销毁的完整钩子
java·后端·spring
小 黄 鸡4 小时前
HashMap 面试必会知识点详解(JDK 8)
java·面试·职场和发展
遇印记4 小时前
传输层,网络层
运维·服务器·网络·windows·学习
死磕音视频5 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers
凤山老林5 小时前
Spring Boot 接入国密 SM2/SM3/SM4 的一些实践记录
spring boot·后端·python
又見山6 小时前
Obsidian 跨平台同步实测:Nutstore Sync 在 Windows、Mac、Linux、iOS、Android 全平台综合测评
windows·macos·obsidian·obsidian同步·obsidian教程·obsidian入门·obsidian笔记库搭建
伯恩bourne6 小时前
Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean
java·spring boot·后端
silvamux_6 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi