Java Stream实战_函数式编程的新方式
1. 引言
1.1 Java Stream简介
- Stream是什么:Stream是Java 8引入的一个接口,用于处理集合数据。
- 与传统集合的区别:Stream不存储数据,而是通过管道操作(如过滤、映射)来处理数据。
- 主要特点:惰性求值、链式调用、函数式编程风格。
1.2 函数式编程基础
- 什么是函数式编程:一种编程范式,强调使用纯函数和不可变数据。
- Java中的函数式接口:如
Function
,Predicate
,Consumer
等。 - Lambda表达式:简化匿名内部类的语法糖。
1.3 Stream API的历史背景和发展
- Java 8之前的集合处理方式:迭代器、增强for循环。
- Stream API的引入动机:提高代码可读性和性能。
- 后续版本的改进:如Java 9的流式文件处理、Java 10的局部变量类型推断等。
2. Stream 基础
2.1 创建Stream
-
从集合创建:
List.stream()
,Set.stream()
等。List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); Stream<String> stream = names.stream();
-
从数组创建:
Arrays.stream(array)
。String[] namesArray = { "Alice", "Bob", "Charlie"}; Stream<String> streamFromArray = Arrays.stream(namesArray);
-
使用静态方法创建:
Stream.of()
,Stream.generate()
,Stream.iterate()
。Stream<String> streamOf = Stream.of("Alice", "Bob", "Charlie"); Stream<Integer> infiniteStream = Stream.iterate(0, n -> n + 1);
2.2 Stream操作类型
-
中间操作:如
filter
,map
,flatMap
等,返回一个新的Stream。List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); Stream<String> filteredStream = names.stream().filter(name -> name.startsWith("A"));
-
终止操作:如
forEach
,collect
,reduce
等,执行计算并返回结果。List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); long count = names.stream().filter(name -> name.startsWith("A")).count();
3. 常用Stream操作
3.1 筛选与切片
-
filter:根据条件筛选元素。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); List<String> filteredNames = names.stream() .filter(name -> name.startsWith("A")) .collect(Collectors.toList());
-
limit:限制返回的元素数量。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); List<String> limitedNames = names.stream() .limit(2) .collect(Collectors.toList());
-
skip:跳过指定数量的元素。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); List<String> skippedNames = names.stream() .skip(1) .collect(Collectors.toList());
3.2 映射
-
map:将每个元素转换为另一个形式。
List<String> names = Arrays.asList("Alice", "Bob", "Charlie"); List<Integer> nameLengths = names.stream() .map(String::length) .collect(Collectors.toList());
-
flatMap:将多个Stream合并为一个Stream。
List<List<String>> listOfLists = Arrays.asList( Arrays.<