一文带你深入了解Java8 Stream流式编程
什么是Java 8 Stream
Java 8中引入了Stream API,通过Stream API,处理集合数据更加简单,更加高效。Stream API就如同一个迭代器(Iterator)一样,单向处理数据流并生成处理结果。
Stream接口可以让我们完成下面的任务:
- 集合类型,比如 List,Set,甚至 Map 等等都可以做为 Stream 的数据源。
- 数据处理操作,包括 filter,map,reduce,find,match ,排序等等。
- 处理结果可以是 Stream类型,也可以是其他集合类型,比如 List,Set 或 Map等。
最基本使用
下面是一个最基本的Stream使用例子:
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("cherry");
list.add("date");
list.add("grape");
list.stream()
.filter(e -> e.startsWith("a"))
.map(String::toUpperCase)
.forEach(System.out::println); // 输出:APPLE
在这个例子中,我们创建了一个String类型的List,通过stream()方法获取数据流,使用filter()方法对数据流进行过滤,使用map()方法对过滤后的结果进行转换,使用forEach()方法进行输出。
中间操作
通常,Stream操作会分成两种:中间操作和最终操作。中间操作会返回一个新的Stream类型对象,所以支持链式调用,常用的中间操作有:
filter
filter方法可以用一个谓词来过滤出所有符合谓词的元素,比如下面这个例子:
Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Stream<Integer> evenNumbers = numbers.filter(n -> n % 2 == 0);
evenNumbers.forEach(System.out::println); // 输出:2 4 6 8 10
map
map方法可以用一个函数转换流中的每个元素,比如下面这个例子:
Stream<String> stream = Stream.of("java", "is", "cool");
Stream<String> upperStream = stream.map(String::toUpperCase);
upperStream.forEach(System.out::println); // 输出:JAVA IS COOL
flatMap
flatMap方法可以让我们将一个流中的内容映射为其他的Stream,将多个Stream中的数据合并到同一个Stream中,比如下面这个例子:
Stream<List<Integer>> stream = Stream.of(
Arrays.asList(1, 2),
Arrays.asList(3, 4, 5),
Arrays.asList(6, 7, 8, 9)
);
Stream<Integer> flatStream = stream.flatMap(t -> t.stream());
flatStream.forEach(System.out::println); // 输出:1 2 3 4 5 6 7 8 9
sorted
sorted方法可以用来对流进行排序,比如下面这个例子:
Stream<String> stream = Stream.of("orange", "banana", "apple");
Stream<String> sortedStream = stream.sorted();
sortedStream.forEach(System.out::println); // 输出:apple banana orange
peek
peek方法可以用于调试Stream的中间操作结果,比如下面这个例子:
Stream<String> stream = Stream.of("apple", "banana", "cherry");
Stream<String> peekStream = stream.peek(System.out::println);
peekStream.forEach(System.out::println); // 输出:apple banana cherry
最终操作
最终操作会触发Stream的处理,常用的最终操作有:
forEach
forEach操作可以对每个元素进行处理,比如下面这个例子:
Stream.of(1, 2, 3, 4, 5)
.filter(x -> x > 2)
.forEach(System.out::println); // 输出:3 4 5
count
count操作可以统计Stream流长度,比如下面这个例子:
long count = Stream.of("apple", "banana", "cherry").count();
System.out.println(count); // 输出:3
toArray
toArray操作可以将Stream转化为一个数组,比如下面这个例子:
Stream<String> stream = Stream.of("apple", "banana", "cherry");
String[] array = stream.toArray(String[]::new);
System.out.println(Arrays.toString(array)); // 输出:[apple, banana, cherry]
reduce
reduce操作可以将流缩减为一个单独的结果,比如下面这个例子:
Optional<Integer> result = Stream.of(1, 2, 3).reduce((x, y) -> x + y);
System.out.println(result.get()); // 输出:6
collect
collect操作可以将Stream输出为集合,比如下面这个例子:
Stream<Integer> stream = Stream.of(1, 2, 3);
List<Integer> list = stream.collect(Collectors.toList());
System.out.println(list); // 输出:[1, 2, 3]
示例
下面是一个示例,通过Stream实现对一个List的排序和输出:
List<Person> persons = Arrays.asList(
new Person("Tom", 10),
new Person("Jerry", 20),
new Person("Mike", 30),
new Person("Joey", 40)
);
List<Person> sortedPersons = persons.stream()
.sorted(Comparator.comparing(Person::getAge))
.collect(Collectors.toList());
sortedPersons.forEach(System.out::println);
输出结果为:
Person{name='Tom', age=10}
Person{name='Jerry', age=20}
Person{name='Mike', age=30}
Person{name='Joey', age=40}
通过sort()方法可以排序List,通过Collectors.toList()方法可以将Stream转化为List。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:一文带你深入了解Java8 Stream流式编程 - Python技术站