为什么Manifest选择本地存储?隐私保护与数据安全深度解析
2026/8/8 18:48:13
Java 8 引入了流(Stream)API,为集合提供了一种更加声明式、函数式的处理方式。流与集合的结合提供了更高效且易于理解的数据处理方式,极大地简化了集合的操作和转换。
流(Stream)是对集合(Collection)和其他数据源(如数组、I/O通道、生成器等)元素的映射、过滤、聚合等操作的抽象。流使得集合的操作更为简洁高效,并且支持惰性计算和并行处理。
流与集合结合的最大特点是可以通过流式操作对集合进行处理,而无需直接操作集合本身。
流的创建方式有多种,常见的创建流的方式包括:
stream()或parallelStream()方法。Arrays.stream()方法。Stream.of()、Stream.generate()等。stream()方法:提供一个串行流,逐一处理集合中的元素。parallelStream()方法:提供一个并行流,能在多核处理器上并行执行操作。流支持链式调用的操作,分为两类:中间操作和终止操作。
filter()、map()、distinct()等,返回一个新的流,不会立即执行。forEach()、collect()、reduce()等,会触发流的处理。filter():过滤流中不符合条件的元素。count():计算流中的元素个数。流的中间操作通常是惰性求值的,这意味着中间操作不会立即执行,直到终止操作出现时才开始执行。
map()等中间操作会返回新的流,实际的计算只有在终止操作调用时才会执行。findFirst()、anyMatch()、allMatch()等操作,它们会在满足某些条件时立即结束流的处理,从而避免多余的计算。findFirst()的短路findFirst():找到流中的第一个元素,遇到结果后就停止进一步的计算。流支持并行操作,允许将流的处理任务分解成多个子任务并在多个处理器上并行执行,从而提高性能。并行流的操作通过ForkJoinPool完成任务的分配和调度。
parallel()方法将流转换为并行流,内部使用线程池ForkJoinPool来并行执行。集合和流的结合允许我们更加简洁高效地处理数据,但要注意优化流的使用以避免性能问题。以下是一些优化技巧:
java复制
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); int sum = numbers.stream() .filter(n -> n % 2 == 0) .mapToInt(Integer::intValue) .sum();mapToInt()等方法减少装箱和拆箱操作,提高性能。流和集合结合在实际开发中非常常见,尤其是在数据处理、转换、筛选等场景。以下是常见的应用场景:
java复制
List<String> words = Arrays.asList("apple", "banana", "cherry"); List<String> result = words.stream() .filter(w -> w.length() > 5) .map(String::toUpperCase) .collect(Collectors.toList());流和集合结合可以有效地减少内存消耗,尤其是在处理大数据时,通过惰性计算和分段计算可以降低内存开销。
java复制
public Stream<T> filter(Predicate<? super T> predicate) { Objects.requireNonNull(predicate); return new StreamSupport<>(new StreamOpFlag[]{StreamOpFlag.NOT_SORTED, StreamOpFlag.DISTINCT}); }