温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java8中Stream如何用

发布时间:2022-10-10 14:02:04 阅读:187 作者:iii 栏目:编程语言
Java开发者专用服务器限时活动,0元免费领,库存有限,领完即止! 点击查看>>

Java8中Stream如何用

目录

  1. 引言
  2. Stream简介
  3. Stream的创建
  4. 中间操作
  5. 终端操作
  6. 并行流
  7. Stream的性能考虑
  8. Stream的常见用例
  9. 总结

引言

Java 8引入了Stream API,这是对集合操作的一次重大革新。Stream API提供了一种高效且易于使用的方式来处理集合数据。通过Stream,开发者可以以声明式的方式处理数据,而不必关心底层的实现细节。本文将详细介绍Stream的使用方法,包括如何创建Stream、中间操作、终端操作、并行流以及性能考虑等。

Stream简介

Stream是Java 8中引入的一个新概念,它代表一个元素序列,支持顺序和并行处理。Stream本身并不存储数据,而是从数据源(如集合、数组、I/O通道等)获取数据,并对其进行一系列操作。Stream的操作分为中间操作和终端操作。中间操作返回一个新的Stream,而终端操作则产生一个结果或副作用。

Stream的创建

在Java 8中,可以通过多种方式创建Stream。以下是几种常见的创建方式:

1. 从集合创建

List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();

2. 从数组创建

String[] array = {"a", "b", "c"};
Stream<String> stream = Arrays.stream(array);

3. 使用Stream.of创建

Stream<String> stream = Stream.of("a", "b", "c");

4. 使用Stream.iterate创建

Stream<Integer> stream = Stream.iterate(0, n -> n + 2).limit(10);

5. 使用Stream.generate创建

Stream<Double> stream = Stream.generate(Math::random).limit(5);

6. 从文件创建

Stream<String> lines = Files.lines(Paths.get("file.txt"));

中间操作

中间操作是对Stream中的元素进行处理的操作,返回一个新的Stream。常见的中间操作包括filtermapflatMapdistinctsortedpeeklimitskip

filter

filter操作用于过滤Stream中的元素,只保留满足条件的元素。

List<String> list = Arrays.asList("a", "b", "c", "d");
Stream<String> filteredStream = list.stream().filter(s -> s.startsWith("a"));

map

map操作用于将Stream中的每个元素映射为另一个元素。

List<String> list = Arrays.asList("a", "b", "c");
Stream<String> mappedStream = list.stream().map(String::toUpperCase);

flatMap

flatMap操作用于将Stream中的每个元素映射为一个Stream,然后将这些Stream合并为一个Stream

List<List<String>> list = Arrays.asList(
    Arrays.asList("a", "b"),
    Arrays.asList("c", "d")
);
Stream<String> flatMappedStream = list.stream().flatMap(Collection::stream);

distinct

distinct操作用于去除Stream中的重复元素。

List<String> list = Arrays.asList("a", "b", "a", "c");
Stream<String> distinctStream = list.stream().distinct();

sorted

sorted操作用于对Stream中的元素进行排序。

List<String> list = Arrays.asList("c", "a", "b");
Stream<String> sortedStream = list.stream().sorted();

peek

peek操作用于对Stream中的每个元素执行一个操作,通常用于调试。

List<String> list = Arrays.asList("a", "b", "c");
Stream<String> peekedStream = list.stream().peek(System.out::println);

limit

limit操作用于截取Stream中的前N个元素。

List<String> list = Arrays.asList("a", "b", "c", "d");
Stream<String> limitedStream = list.stream().limit(2);

skip

skip操用于跳过Stream中的前N个元素。

List<String> list = Arrays.asList("a", "b", "c", "d");
Stream<String> skippedStream = list.stream().skip(2);

终端操作

终端操作是对Stream中的元素进行最终处理的操作,产生一个结果或副作用。常见的终端操作包括forEachtoArrayreducecollectminmaxcountanyMatchallMatchnoneMatchfindFirstfindAny

forEach

forEach操作用于对Stream中的每个元素执行一个操作。

List<String> list = Arrays.asList("a", "b", "c");
list.stream().forEach(System.out::println);

toArray

toArray操作用于将Stream中的元素转换为数组。

List<String> list = Arrays.asList("a", "b", "c");
String[] array = list.stream().toArray(String[]::new);

reduce

reduce操作用于将Stream中的元素通过某种方式组合起来,产生一个结果。

List<Integer> list = Arrays.asList(1, 2, 3, 4);
Optional<Integer> sum = list.stream().reduce(Integer::sum);

collect

collect操作用于将Stream中的元素收集到一个集合中。

List<String> list = Arrays.asList("a", "b", "c");
List<String> collectedList = list.stream().collect(Collectors.toList());

min

min操作用于找出Stream中的最小元素。

List<Integer> list = Arrays.asList(1, 2, 3, 4);
Optional<Integer> min = list.stream().min(Integer::compareTo);

max

max操作用于找出Stream中的最大元素。

List<Integer> list = Arrays.asList(1, 2, 3, 4);
Optional<Integer> max = list.stream().max(Integer::compareTo);

count

count操作用于统计Stream中的元素个数。

List<String> list = Arrays.asList("a", "b", "c");
long count = list.stream().count();

anyMatch

anyMatch操作用于判断Stream中是否有元素满足某个条件。

List<String> list = Arrays.asList("a", "b", "c");
boolean anyMatch = list.stream().anyMatch(s -> s.startsWith("a"));

allMatch

allMatch操作用于判断Stream中的所有元素是否都满足某个条件。

List<String> list = Arrays.asList("a", "b", "c");
boolean allMatch = list.stream().allMatch(s -> s.startsWith("a"));

noneMatch

noneMatch操作用于判断Stream中是否没有元素满足某个条件。

List<String> list = Arrays.asList("a", "b", "c");
boolean noneMatch = list.stream().noneMatch(s -> s.startsWith("d"));

findFirst

findFirst操作用于找出Stream中的第一个元素。

List<String> list = Arrays.asList("a", "b", "c");
Optional<String> first = list.stream().findFirst();

findAny

findAny操作用于找出Stream中的任意一个元素。

List<String> list = Arrays.asList("a", "b", "c");
Optional<String> any = list.stream().findAny();

并行流

Stream API支持并行处理,可以通过parallelStream方法将Stream转换为并行流。并行流会将任务分解为多个子任务,并行执行,从而提高处理效率。

List<String> list = Arrays.asList("a", "b", "c");
Stream<String> parallelStream = list.parallelStream();

需要注意的是,并行流并不总是比顺序流更快,特别是在数据量较小或任务本身较为简单的情况下。因此,在使用并行流时,需要根据具体情况进行权衡。

Stream的性能考虑

虽然Stream API提供了强大的功能,但在使用时也需要注意性能问题。以下是一些性能优化的建议:

  1. 避免不必要的中间操作:每个中间操作都会创建一个新的Stream,因此应尽量减少中间操作的数量。
  2. 使用并行流时注意线程安全:并行流在多线程环境下运行,因此需要确保操作是线程安全的。
  3. 避免在Stream中使用阻塞操作:阻塞操作会降低Stream的性能,应尽量避免。
  4. 使用Stream时注意内存消耗Stream操作可能会消耗大量内存,特别是在处理大数据集时,应注意内存的使用情况。

Stream的常见用例

Stream API在实际开发中有许多常见的用例,以下是一些典型的例子:

1. 过滤和映射

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> result = names.stream()
    .filter(name -> name.length() > 4)
    .map(String::toUpperCase)
    .collect(Collectors.toList());

2. 分组和统计

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
Map<Integer, Long> result = names.stream()
    .collect(Collectors.groupingBy(String::length, Collectors.counting()));

3. 排序和去重

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Alice");
List<String> result = names.stream()
    .distinct()
    .sorted()
    .collect(Collectors.toList());

4. 并行处理

List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David");
List<String> result = names.parallelStream()
    .map(String::toUpperCase)
    .collect(Collectors.toList());

总结

Java 8中的Stream API为集合操作提供了一种高效且易于使用的方式。通过Stream,开发者可以以声明式的方式处理数据,而不必关心底层的实现细节。本文详细介绍了Stream的创建、中间操作、终端操作、并行流以及性能考虑等内容,并提供了常见的用例。希望本文能帮助读者更好地理解和使用Stream API。

亿速云「云服务器」,即开即用、新一代英特尔至强铂金CPU、三副本存储NVMe SSD云盘,价格低至29元/月。点击查看>>

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI

开发者交流群×