Java高频面试之SE-23

news/2025/2/27 8:21:39

hello啊,各位观众姥爷们!!!本baby今天又来了!哈哈哈哈哈嗝🐶

Java 中的 Stream 是 Java 8 引入的一种全新的数据处理方式,它基于函数式编程思想,提供了一种高效、简洁且灵活的方式来操作集合数据。Stream 的核心思想是 声明式编程(告诉程序“做什么”,而不是“怎么做”)。


1. Stream 的核心特点

  1. 无存储:Stream 不存储数据,只是对数据源的视图(如集合、数组、I/O 通道等)。
  2. 函数式操作:支持链式调用(如 filter → map → collect),每个操作返回新的 Stream。
  3. 延迟执行(Lazy Evaluation):中间操作(如 filtermap)不会立即执行,只有在终端操作(如 collect)触发时才会计算。
  4. 可消费性:Stream 只能被消费一次,终端操作后 Stream 即失效。

2. Stream 的创建

Stream 可以通过多种方式创建:

(1) 从集合创建
java">List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();       // 顺序流
Stream<String> parallelStream = list.parallelStream(); // 并行流
(2) 从数组创建
java">String[] array = {"a", "b", "c"};
Stream<String> stream = Arrays.stream(array);
(3) 静态工厂方法
java">Stream<String> stream = Stream.of("a", "b", "c");
Stream<Integer> infiniteStream = Stream.iterate(0, n -> n + 1); // 无限流
Stream<Double> randomStream = Stream.generate(Math::random);     // 生成流

3. Stream 的操作分类

Stream 的操作分为两类:

  • 中间操作(Intermediate Operations):返回新的 Stream,可以链式调用(如 filter, map, sorted)。
  • 终端操作(Terminal Operations):触发计算并关闭 Stream(如 collect, forEach, reduce)。

4. 常用中间操作

(1) filter(Predicate<T>):过滤元素
java">List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> evens = numbers.stream()
    .filter(n -> n % 2 == 0)
    .collect(Collectors.toList()); // [2, 4]
(2) map(Function<T, R>):元素转换
java">List<String> words = Arrays.asList("apple", "banana");
List<Integer> lengths = words.stream()
    .map(String::length)
    .collect(Collectors.toList()); // [5, 6]
(3) sorted():排序
java">List<Integer> numbers = Arrays.asList(3, 1, 4);
List<Integer> sorted = numbers.stream()
    .sorted()
    .collect(Collectors.toList()); // [1, 3, 4]
(4) distinct():去重
java">List<Integer> numbers = Arrays.asList(1, 2, 2, 3);
List<Integer> unique = numbers.stream()
    .distinct()
    .collect(Collectors.toList()); // [1, 2, 3]
(5) limit(long)skip(long):限制和跳过元素
java">List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
List<Integer> result = numbers.stream()
    .skip(2)
    .limit(2)
    .collect(Collectors.toList()); // [3, 4]

5. 常用终端操作

(1) collect(Collector):将流转换为集合或其他结构
java">List<String> list = Stream.of("a", "b", "c")
    .collect(Collectors.toList()); // [a, b, c]

String joined = Stream.of("a", "b", "c")
    .collect(Collectors.joining(", ")); // "a, b, c"
(2) forEach(Consumer<T>):遍历元素
java">Stream.of("a", "b", "c")
    .forEach(System.out::println); // 输出 a b c
(3) reduce(BinaryOperator<T>):归约操作(如求和)
java">int sum = Stream.of(1, 2, 3, 4)
    .reduce(0, Integer::sum); // 10
(4) count():统计元素数量
java">long count = Stream.of(1, 2, 3).count(); // 3
(5) anyMatch() / allMatch() / noneMatch():条件匹配
java">boolean hasEven = Stream.of(1, 3, 5)
    .anyMatch(n -> n % 2 == 0); // false

6. 并行流(Parallel Stream)

通过 parallelStream()stream().parallel() 创建并行流,利用多核处理器加速处理:

java">List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
List<Integer> squares = numbers.parallelStream()
    .map(n -> n * n)
    .collect(Collectors.toList()); // [1, 4, 9, 16]

注意

  • 并行流适用于数据量大且无状态的操作。
  • 避免在并行流中使用共享可变变量。

7. 原始类型流(Primitive Streams)

Java 提供了针对原始类型的流,避免装箱开销:

  • IntStreamint 类型)
  • LongStreamlong 类型)
  • DoubleStreamdouble 类型)
java">IntStream.range(1, 5).forEach(System.out::println); // 输出 1 2 3 4
double avg = DoubleStream.of(1.0, 2.0, 3.0).average().orElse(0); // 2.0

8. Stream 的典型应用场景

(1) 集合过滤和转换
java">List<User> users = ...;
List<String> names = users.stream()
    .filter(u -> u.getAge() > 18)
    .map(User::getName)
    .collect(Collectors.toList());
(2) 分组和统计
java">Map<String, List<User>> groupByCity = users.stream()
    .collect(Collectors.groupingBy(User::getCity));
(3) 数据归约
java">int totalAge = users.stream()
    .mapToInt(User::getAge)
    .sum();

9. 注意事项

  1. Stream 不可重用:终端操作后 Stream 关闭,再次使用会抛出 IllegalStateException
  2. 避免副作用:不要在 mapfilter 中修改外部状态。
  3. 性能权衡:并行流不一定更快,需根据数据量和操作复杂度评估。

在这里插入图片描述


http://www.niftyadmin.cn/n/5869791.html

相关文章

Spark内存迭代计算

一、宽窄依赖 窄依赖&#xff1a;父RDD的一个分区数据全部发往子RDD的一个分区 宽依赖&#xff1a;父RDD的一个分区数据发往子RDD的多个分区&#xff0c;也称为shuffle 二、Spark是如何进行内存计算的&#xff1f;DAG的作用&#xff1f;Stage阶段划分的作用&#xff1f; &a…

WSL2下,向github进行push时出现timeout的问题

昨晚在完成15445 Project2.2后&#xff0c;笔者兴致冲冲地准备把代码提交到github上&#xff0c;谁知一连提交几次都出现 ssh:connect to host github.com port 22: Connection timed out 这个问题。我开始还以为是网络波动&#xff0c;测试了多次之后才发现应该是22端口出问题…

Linux:(3)

一&#xff1a;Linux和Linux互传&#xff08;压缩包&#xff09; scp:Linux scp 命令用于 Linux 之间复制文件和目录。 scp 是 secure copy 的缩写, scp 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令。 scp 是加密的&#xff0c;rcp 是不加密的&#xff0c;scp 是…

【图形学入门笔记】线性代数的本质

【笔记未完待续】如果我的分享对你有帮助&#xff0c;请记得点赞关注不迷路。 视频源地址&#xff1a;https://www.youtube.com/watch?vfNk_zzaMoSs 作者&#xff1a;3Blue1Brown 此处仅做个人笔记使用。 01 - 向量究竟是什么&#xff1f; 线性代数中最基础、最根源的…

Tomcat 目录结构和应用实现

Tomcat 是一款开源的、轻量级的 Web 服务器&#xff0c;它不仅能够提供 HTTP 服务&#xff0c;还能够运行 Java Servlet 和 JavaServer Pages&#xff08;JSP&#xff09;。对于许多开发者来说&#xff0c;理解 Tomcat 的目录结构以及如何在该结构中组织应用&#xff0c;往往是…

解决Deepseek“服务器繁忙,请稍后再试”问题,基于硅基流动和chatbox的解决方案

文章目录 前言操作步骤步骤1&#xff1a;注册账号步骤2&#xff1a;在线体验步骤3&#xff1a;获取API密钥步骤4&#xff1a;安装chatbox步骤5&#xff1a;chatbox设置 价格方面 前言 最近在使用DeepSeek时&#xff0c;开启深度思考功能后&#xff0c;频繁遇到“服务器繁忙&am…

C++ Primer Plus第八章课后习题总结

1. 编写通常接受一个参数&#xff08;字符串的地址&#xff09;&#xff0c;并打印该字符串的函数。然而&#xff0c;如果提供了第二个参数&#xff08;int类型&#xff09;&#xff0c;且该参数不为0&#xff0c;则该函数打印字符串的次数将为该函数被调用的次数&#xff08;注…

JVM垃圾回收器深度底层原理分析与知识体系构建

一、垃圾回收的基本步骤 标记&#xff08;Marking&#xff09; 从GC Roots&#xff08;如虚拟机栈、方法区静态变量、本地方法栈等&#xff09;出发&#xff0c;遍历对象引用链&#xff0c;标记所有可达对象为存活对象&#xff0c;未被标记的则视为垃圾。此阶段需暂停用户线程&…