Stream API 可以分为以下几个主要类别:
- 创建流(Creating Streams):
Stream.of(T... values):从一个变量参数创建流。Arrays.stream(T[] array):从数组创建流。Collection.stream():从集合创建流。Stream.iterate(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next):创建一个无限的流,从一个初始值开始,每次应用一个函数。Stream.generate(Supplier<T> s):创建一个无限的流,每次从给定的 Supplier 获取值。
- 中间操作(Intermediate Operations):
- 无状态(Stateless):
filter,map,flatMap,peek,limit,sorted等。 - 有状态(Stateful):
distinct,sorted(有状态,因为它需要跟踪元素以维护排序顺序)。
- 无状态(Stateless):
- 终止操作(Terminal Operations):
- 聚合操作:
reduce,collect,allMatch,anyMatch,noneMatch,count,forEach等。 - 规约/求值操作:
forEach,toArray,reduce,collect等。 - 短路操作:
anyMatch,allMatch,noneMatch,findFirst,findAny。
- 聚合操作:
- 并行操作(Parallel Operations):
- 任何流都可以被并行化,通过调用
parallelStream()方法。 - 并行流是优化的,可以在多核处理器上并行执行操作。
- 任何流都可以被并行化,通过调用
- 收集器(Collectors):
Collectors类提供了很多静态方法,用于在终止操作中将流转换为不同类型的结果,如集合、数组或复合对象。- 常用的收集器包括
toList(),toSet(),toMap(),joining(),groupingBy(),reducing()等。
- 短路操作(Short-circuiting Operations):
- 这些操作在找到第一个匹配元素时就会停止处理流,如
anyMatch,allMatch,noneMatch,findFirst,findAny。
- 这些操作在找到第一个匹配元素时就会停止处理流,如
- 非短路操作(Non-Short-circuiting Operations):
- 这些操作会处理流中的所有元素,如
allMatch,noneMatch,count,forEach。
- 这些操作会处理流中的所有元素,如
- 无序操作(Unordered Operations):
- 某些操作不保证结果的顺序,如
forEach。
- 某些操作不保证结果的顺序,如
- 有序操作(Ordered Operations):
- 某些操作会保持元素的顺序,如
sorted,limit。
- 某些操作会保持元素的顺序,如
map(Function<? super T, ? extends R> mapper):
List<String> words = Arrays.asList("a", "bb", "ccc", "dddd");
List<Integer> lengths = words.stream()
.map(String::length)
.collect(Collectors.toList());
filter(Predicate<? super T> predicate):
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6);
List<Integer> evenNumbers = numbers.stream()
.filter(n -> n % 2 == 0)
.collect(Collectors.toList());
forEach(Consumer<? super T> action):
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> upperCaseNames = new ArrayList<>();
names.stream()
.forEach(name -> upperCaseNames.add(name.toUpperCase()));
sorted(Comparator<? super T> comparator):
List<String> words = Arrays.asList("apple", "banana", "cherry");
List<String> sortedWords = words.stream()
.sorted()
.collect(Collectors.toList());
reduce(BinaryOperator<T> accumulator):
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
.reduce(0, (a, b) -> a + b);
anyMatch(Predicate<? super T> predicate):
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
boolean hasEvenNumber = numbers.stream()
.anyMatch(n -> n % 2 == 0);
allMatch(Predicate<? super T> predicate):
List<Integer> numbers = Arrays.asList(2, 4, 6, 8);
boolean allEven = numbers.stream()
.allMatch(n -> n % 2 == 0);
noneMatch(Predicate<? super T> predicate):
List<Integer> numbers = Arrays.asList(1, 3, 5);
boolean noEvenNumber = numbers.stream()
.noneMatch(n -> n % 2 == 0);
findFirst():
List<String> words = Arrays.asList("apple", "banana", "cherry");
Optional<String> firstWord = words.stream()
.findFirst();
findAny():
List<String> words = Arrays.asList("apple", "banana", "cherry");
Optional<String> anyWord = words.parallelStream()
.findAny();
collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator, BiConsumer<R, R> combiner):
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
int sum = numbers.stream()
.collect(()->0,
(acc, item) -> acc += item,
(acc1, acc2) -> acc1 + acc2);
flatMap(Function<? super T, ? extends Stream<? extends R>> mapper):
List<List<Integer>> listOfLists = Arrays.asList(
Arrays.asList(1, 2),
Arrays.asList(3, 4),
Arrays.asList(5, 6)
);
List<Integer> allElements = listOfLists.stream()
.flatMap(List::stream)
.collect(Collectors.toList());

Comments NOTHING