Java 8引入的Stream
API为集合(Collections)提供了一种声明式的处理方式,支持丰富的操作,包括筛选、映射、归约等。以下是一些Stream
的主要功能和使用方式的案例:
List<String> list = Arrays.asList("apple", "banana", "orange");
Stream<String> streamFromCollection = list.stream();
Stream<String> streamFromValues = Stream.of("apple", "banana", "orange");
List<String> filteredList = list.stream()
.filter(fruit -> fruit.startsWith("a"))
.collect(Collectors.toList());
System.out.println("Filtered List: " + filteredList);
List<String> uppercasedList = list.stream()
.map(String::toUpperCase)
.collect(Collectors.toList());
System.out.println("Uppercased List: " + uppercasedList);
List<List<String>> nestedList = Arrays.asList(
Arrays.asList("apple", "banana"),
Arrays.asList("orange", "grape")
);
List<String> flatMapList = nestedList.stream()
.flatMap(Collection::stream)
.collect(Collectors.toList());
// FlatMap List: [apple, banana, orange, grape]
System.out.println("FlatMap List: " + flatMapList);
List<String> limitedList = list.stream()
.limit(2)
.collect(Collectors.toList());
List<String> skippedList = list.stream()
.skip(1)
.collect(Collectors.toList());
System.out.println("Limited List: " + limitedList);
System.out.println("Skipped List: " + skippedList);
List<String> sortedList = list.stream()
.sorted()
.collect(Collectors.toList());
System.out.println("Sorted List: " + sortedList);
boolean anyStartsWithA = list.stream().anyMatch(fruit -> fruit.startsWith("a"));
boolean allStartWithA = list.stream().allMatch(fruit -> fruit.startsWith("a"));
boolean noneStartsWithZ = list.stream().noneMatch(fruit -> fruit.startsWith("z"));
System.out.println("Any starts with 'a': " + anyStartsWithA);
System.out.println("All start with 'a': " + allStartWithA);
System.out.println("None starts with 'z': " + noneStartsWithZ);
Optional<String> concatenated = list.stream().reduce((s1, s2) -> s1 + ", " + s2);
concatenated.ifPresent(result -> System.out.println("Concatenated: " + result));
List<String> collectedList = list.stream()
.filter(fruit -> fruit.length() > 5)
.collect(Collectors.toList());
Set<String> collectedSet = list.stream()
.filter(fruit -> fruit.length() > 5)
.collect(Collectors.toSet());
String joinedString = list.stream()
.collect(Collectors.joining(", "));
System.out.println("Collected List: " + collectedList);
System.out.println("Collected Set: " + collectedSet);
System.out.println("Joined String: " + joinedString);
这些例子展示了Stream
API的一些常见用法。Stream
提供了丰富的操作,使得对集合进行处理变得更加简洁和表达力强。
Stream
是 Java 8 引入的一种处理集合(Collections)数据的新方式,它主要解决了在集合上进行复杂操作时代码的繁琐性、可读性差和性能问题。以下是一些 Stream
的优点和解决的问题,并附带一些案例:
声明式编程:
Stream
提供了声明式的编程方式,可以更清晰地表达对集合的操作。List<String> fruits = Arrays.asList("apple", "banana", "orange");
fruits.stream().filter(s -> s.startsWith("a")).forEach(System.out::println);
链式调用:
Stream
支持链式调用,可以在一次迭代中执行多个操作。List<String> result = fruits.stream()
.filter(s -> s.startsWith("a"))
.map(String::toUpperCase)
.collect(Collectors.toList());
不可变性和延迟执行:
Stream
操作不会改变原集合,而是返回一个新的 Stream
,并且操作是延迟执行的。List<String> result = fruits.stream()
.filter(s -> s.startsWith("a"))
.map(String::toUpperCase)
.collect(Collectors.toList());
并行处理:
Stream
提供了简便的方法来实现并行处理,提高了性能。long count = fruits.parallelStream().filter(s -> s.startsWith("a")).count();
简化聚合操作:
Stream
提供了内置的聚合操作,简化了这类操作。double averageLength = fruits.stream().mapToInt(String::length).average().orElse(0);
这些案例展示了 Stream
如何解决传统集合操作中的一些问题,并提供了更简洁、清晰和高效的处理方式。通过使用 Stream
,代码变得更加表达力强,可读性更高,并且在某些情况下能够更容易地实现并行化。