searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

Stream流的详细用法

2023-09-06 08:45:44
12
0

1、流的定义

      Java 8引入了 Stream 流的概念,它是对集合对象(Collection)进行操作的高级抽象。Stream流的操作分为两种:中间操作和终端操作。中间操作是指在流上进行的操作,返回的仍然是一个流,可以进行链式操作,而终端操作是指对流的最终操作,返回的是一个结果或者一个副作用。使用流可以方便的对集合进行复杂的查找、过滤、筛选等操作。

2、流的创建

  • 通过集合类的 stream() 方法或者 parallelStream() 方法来创建一个流
  • 通过 Arrays 类的 stream() 方法来创建一个数组流
  • 使用Stream类的of()方法来创建一个流
  • 通过文件、网络、IO流等方式来创建流

3、常用方法

3.1 中间操作

  • filter(Predicate predicate):根据给定的条件对流进行过滤,只保留满足条件的元素。

// 使用filter()方法过滤出偶数
Stream<Integer> evenNumbersStream = numbers.stream().filter(number -> number % 2 == 0);
  • map(Function<T, R> mapper):将流中的每个元素通过给定的映射函数进行转换。

// 将名字转换为大写
List<String> upperCaseNames = names.stream().map(String::toUpperCase).collect(Collectors.toList());
  • flatMap(Function<T, Stream> mapper):将流中的每个元素通过给定的映射函数转换为一个新的流,并将所有流合并为一个流。

// 将二维列表转换为一维列表,numbers为二维列表
List<Integer> flattenedList = numbers.stream().flatMap(List::stream).collect(Collectors.toList());
  •  sorted():对流进行排序,默认按照元素的自然顺序进行排序。

// 对流进行排序
List<Integer> sortedList = numbers.stream().sorted().collect(Collectors.toList());
  • distinct():去除流中的重复元素。

// 去除流中的重复元素
List<Integer> distinctList = numbers.stream().distinct().collect(Collectors.toList());

     注意:distinct()方法会根据元素的hashCode()和equals()方法来判断元素是否重复。因此,如果要去除流中的自定义对象的重复元素,需要重写该对象的hashCode()和equals()方法。

  • limit(long maxSize):限制流的大小,只取前N个元素。

// 限制流的大小,只取前5个元素
Stream<Integer> limitedStream = infiniteStream.limit(5);

      使用limit()方法可以在处理大量数据时,只取需要的部分数据进行操作,提高程序的性能。

3.2 终端操作

  • forEach(Consumer action):对流中的每个元素执行给定的操作。

// 创建一个包含字符串的流
Stream<String> stringStream = Stream.of("apple", "banana", "cherry");
// 对流中的每个元素执行操作
stringStream.forEach(s -> System.out.println("Fruit: " + s));

      使用forEach()方法可以对流中的每个元素执行任意操作,如打印、计算、过滤等。它是一种简洁、方便的遍历流元素的方式。

  • collect(Collector<T, A, R> collector):将流中的元素收集到一个集合中,可以是List、Set、Map等。

// 创建一个包含整数的流
Stream<Integer> numberStream = Stream.of(1, 2, 3, 4, 5);
// 将流中的元素收集到List集合中
List<Integer> numberList = numberStream.collect(Collectors.toList());

      使用collect()方法可以将流中的元素收集到各种集合中,例如List、Set、Map等。Collectors类提供了许多静态方法,用于创建各种收集器,以满足不同的需求。

  • count():返回流中的元素个数。

// 创建一个包含整数的流
Stream<Integer> numberStream = Stream.of(1, 2, 3, 4, 5);
// 获取流中的元素个数
long count = numberStream.count();

      使用count()方法可以方便地获取流中元素的个数,无需遍历整个流。这对于需要统计元素个数的场景非常有用。

  • anyMatch(Predicate predicate):检查流中是否存在满足给定条件的元素。

// 检查流中是否存在长度大于5的元素
boolean anyMatch = stringStream.anyMatch(s -> s.length() > 5);

      使用anyMatch()方法可以方便地检查流中是否存在满足给定条件的元素,无需遍历整个流。这对于需要判断某个条件是否成立的场景非常有用。

  • allMatch(Predicate predicate):检查流中的所有元素是否都满足给定条件。

// 检查流中是否所有元素都大于0
boolean allMatch = numberStream.allMatch(n -> n > 0);

      使用allMatch()方法可以方便地检查流中的所有元素是否都满足给定条件,如果流中的元素个数很大,一旦发现有某个元素不满足条件,就会立即返回false,无需遍历整个流。这对于需要判断所有元素是否满足某个条件的场景非常有用。

  • min(Comparator comparator):返回流中的最小元素。

// 创建一个包含字符串的流
Stream<String> stringStream = Stream.of("apple", "banana", "orange", "grape");
// 找到字典序最小的字符串
Optional<String> minString = stringStream.min(Comparator.naturalOrder());

      min()方法返回一个Optional对象,表示流中的最小元素。我们可以使用ifPresent()方法检查Optional对象是否有值,如果有值则打印出结果。

  • max(Comparator comparator):返回流中的最大元素。

// 创建一个包含整数的流
Stream<Integer> integerStream = Stream.of(5, 2, 8, 1, 10);
// 找到最大的整数
Optional<Integer> maxInteger = integerStream.max(Comparator.naturalOrder());

      max()方法返回一个Optional对象,表示流中的最大元素。我们可以使用ifPresent()方法检查Optional对象是否有值,如果有值则打印出结果。

0条评论
0 / 1000
lixx
2文章数
0粉丝数
lixx
2 文章 | 0 粉丝