问题背景:
Stream API是在Java 8中添加的,旨在简化函数式编程和集合的并行处理。它提供了一种通过lambda表达式描述数据操作链的方便方式。
问题:
在没有Stream API的情况下,必须编写冗长的命令式代码来过滤、排序和聚合集合。这带来了错误的潜在可能性,维护的复杂性,以及在尝试手动添加并行性时的低效率。
解决方案:
Stream API允许构建由中间操作(intermediate)和终端操作(terminal)组成的管道。流是惰性的,按顺序或并行处理数据,代码变得更加简洁和富有表现力。
处理集合的示例:
List<String> names = Arrays.asList("安娜", "伊万", "彼得", "伊娃"); names.stream() .filter(s -> s.length() > 3) .map(String::toUpperCase) .sorted() .forEach(System.out::println);
关键特点:
parallelStream()),但需要考虑集合和函数的线程安全性关闭后是否可以重用同一个Stream?
不可以,尝试重用关闭的Stream会抛出IllegalStateException。流是一次性的。
在创建Stream后,修改原始集合会影响吗?
会的,如果集合在创建Stream后、终端操作前被修改,可能会导致ConcurrentModificationException。
可以在Stream操作中使用外部可变变量吗?
不推荐,因为在并行流中这会导致意外的错误。最好在Stream管道中避免可变的副作用。
.parallelStream()程序员通过Stream调用某个方法,改变外部列表——这在顺序执行时有效,但在并行执行时会导致数据结构的混乱。
优点:
缺点:
整个管道构建得很干净:操作没有副作用,仅使用不可变集合,通过收集器收集最终结果。
优点:
缺点: