Stream(流)
1:什么是stream(流)
流(stream)是指数据在计算机系统中的连续传输。它是一种将大块数据分割成较小的数据块,并按顺序逐个传输的方式。流可以用于在计算机系统内部的不同组件之间传递数据,也可以用于与外部设备(如文件、网络等)进行数据交互。
流的特点是数据的连续性和顺序性。它可以实时地传输数据,而无需等待整个数据块加载完成。这种特性使得流在处理大量数据或需要持续传输数据的场景中非常有用。
流可以被分为输入流(input stream)和输出流(output stream)。输入流用于从外部读取数据到计算机系统中,而输出流用于将数据从计算机系统输出到外部。
流的使用广泛,例如在文件操作中,可以通过流来读取或写入文件;在网络通信中,可以使用流来传输数据;在音视频处理中,可以使用流来实现实时的数据传输等。
总而言之,流是一种数据传输的方式,通过将大块数据分割成较小的数据块并按顺序传输,实现了高效的数据传输和处理。
2:图例
3:怎么运用stream(流)?
1:创建流:
-
从集合创建流:可以通过集合类的
stream()
方法来创建一个顺序流,或者使用parallelStream()
方法创建一个并行流。List<String> list = Arrays.asList("apple", "banana", "orange"); Stream<String> stream = list.stream(); // 创建顺序流 Stream<String> parallelStream = list.parallelStream(); // 创建并行流
-
从数组创建流:
int[] array = {1, 2, 3, 4, 5}; IntStream stream = Arrays.stream(array); // 创建IntStream流
2:中间操作:
Stream流支持一系列中间操作,这些操作可以对流中的元素进行筛选、映射、排序等处理。常见的中间操作包括:
-
filter(Predicate<T> predicate)
:根据条件过滤流中的元素。filter操作示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David", "Eve"); // 使用filter筛选出长度大于3的名字 List<String> longNames = names.stream() .filter(name -> name.length() > 3) .collect(Collectors.toList()); System.out.println(longNames); // 输出结果:[Alice, Charlie, David]
-
map(Function<T, R> mapper)
:将流中的元素映射为新的元素。map操作示例:
List<String> words = Arrays.asList("apple", "banana", "orange"); // 使用map将单词转换为大写形式 List<String> upperCaseWords = words.stream() .map(String::toUpperCase) .collect(Collectors.toList()); System.out.println(upperCaseWords); // 输出结果:[APPLE, BANANA, ORANGE]
-
flatMap:将流中的每个元素转换为流,并将所有流的元素合并成一个流。
flatMap操作示例:
List<List<Integer>> numbers = Arrays.asList( Arrays.asList(1, 2), Arrays.asList(3, 4), Arrays.asList(5, 6) ); List<Integer> flattenedNumbers = numbers.stream() .flatMap(Collection::stream) .collect(Collectors.toList()); System.out.println(flattenedNumbers); // 输出结果:[1, 2, 3, 4, 5, 6]
-
skip:跳过指定数量的元素。
skip操作示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); List<Integer> skippedNumbers = numbers.stream() .skip(2) .collect(Collectors.toList()); System.out.println(skippedNumbers); // 输出结果:[3, 4, 5]
-
limit:限制流中元素的数量。
limit操作示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); List<Integer> limitedNumbers = numbers.stream() .limit(3) .collect(Collectors.toList()); System.out.println(limitedNumbers); // 输出结果:[1, 2, 3]
-
sorted(Comparator<T> comparator)
:对流中的元素进行排序。sorted操作示例:
List<Integer> numbers = Arrays.asList(5, 3, 8, 2, 9); // 使用sorted对数字进行升序排序 List<Integer> sortedNumbers = numbers.stream() .sorted() .collect(Collectors.toList()); System.out.println(sortedNumbers); // 输出结果:[2, 3, 5, 8, 9]
-
distinct()
:去除流中的重复元素。distinct操作示例:
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 3, 3, 4, 5, 5, 5); // 使用distinct去除重复的数字 List<Integer> uniqueNumbers = numbers.stream() .distinct() .collect(Collectors.toList()); System.out.println(uniqueNumbers); // 输出结果:[1, 2, 3, 4, 5]
3:终端操作:
Stream流的中间操作必须以终端操作结束,终端操作会触发流的处理并生成最终的结果。常见的终端操作包括:
-
forEach(Consumer<T> action)
:对流中的每个元素执行指定操作。forEach操作示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie", "David"); // 使用forEach打印每个名字 names.stream() .forEach(System.out::println);
-
collect(Collector<T, A, R> collector)
:将流中的元素收集到一个集合或其他数据结构中。collect操作示例:
List<String> fruits = Arrays.asList("apple", "banana", "orange"); // 使用collect将水果列表转换为大写形式的集合 List<String> upperCaseFruits = fruits.stream() .map(String::toUpperCase) .collect(Collectors.toList()); System.out.println(upperCaseFruits); // 输出结果:[APPLE, BANANA, ORANGE]
-
count()
:返回流中元素的个数。count操作示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); // 使用count获取数字的数量 long count = numbers.stream() .count(); System.out.println(count); // 输出结果:5
-
reduce:根据指定的操作,将流中的元素进行归约操作。
reduce操作示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); Optional<Integer> sum = numbers.stream() .reduce(Integer::sum); if (sum.isPresent()) { System.out.println(sum.get()); // 输出结果:15 }
-
anyMatch:判断流中是否存在满足条件的元素。
anyMatch操作示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); boolean hasEvenNumber = numbers.stream() .anyMatch(n -> n % 2 == 0); System.out.println(hasEvenNumber); // 输出结果:true
-
allMatch:判断流中的所有元素是否都满足条件。
allMatch操作示例:
List<Integer> numbers = Arrays.asList(2, 4, 6, 8, 10); boolean allEvenNumbers = numbers.stream() .allMatch(n -> n % 2 == 0); System.out.println(allEvenNumbers); // 输出结果:true
-
noneMatch:判断流中是否没有任何元素满足条件。
noneMatch操作示例:
List<Integer> numbers = Arrays.asList(1, 3, 5, 7, 9); boolean noneGreaterThanTen = numbers.stream() .noneMatch(n -> n > 10); System.out.println(noneGreaterThanTen); // 输出结果:true
-
findFirst:获取流中的第一个元素。
findFirst操作示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); Optional<Integer> firstNumber = numbers.stream() .findFirst(); if (firstNumber.isPresent()) { System.out.println(firstNumber.get()); // 输出结果:1 }
-
findAny:获取流中的任意一个元素。
findAny操作示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5); Optional<Integer> anyNumber = numbers.stream() .findAny(); if (anyNumber.isPresent()) { System.out.println(anyNumber.get()); // 输出结果:1或者2或者3等等 }
-
max(Comparator<T> comparator)
、min(Comparator<T> comparator)
:返回流中的最大值或最小值。max操作示例:
List<Integer> numbers = Arrays.asList(1, 5, 2, 4, 3); // 使用max获取数字列表中的最大值 Optional<Integer> maxNumber = numbers.stream() .max(Integer::compareTo); if (maxNumber.isPresent()) { System.out.println(maxNumber.get()); // 输出结果:5 }
min操作示例:
List<Integer> numbers = Arrays.asList(1, 5, 2, 4, 3); // 使用min获取数字列表中的最小值 Optional<Integer> minNumber = numbers.stream() .min(Integer::compareTo); if (minNumber.isPresent()) { System.out.println(minNumber.get()); // 输出结果:1 }
List<Integer> numbers = Arrays.asList(1, 5, 2, 4, 3); // 使用min获取数字列表中的最小值 Optional<Integer> minNumber = numbers.stream() .min(Integer::compareTo); if (minNumber.isPresent()) { System.out.println(minNumber.get()); // 输出结果:1 }