Java8新特性 - Stream

一、特性

Java 8引入的Stream API为集合(Collections)提供了一种声明式的处理方式,支持丰富的操作,包括筛选、映射、归约等。以下是一些Stream的主要功能和使用方式的案例:

  1. 创建Stream:
java 复制代码
List<String> list = Arrays.asList("apple", "banana", "orange");
Stream<String> streamFromCollection = list.stream();
Stream<String> streamFromValues = Stream.of("apple", "banana", "orange");
  1. 过滤(Filter):
java 复制代码
List<String> filteredList = list.stream()
                               .filter(fruit -> fruit.startsWith("a"))
                               .collect(Collectors.toList());
System.out.println("Filtered List: " + filteredList);
  1. 映射(Map):
java 复制代码
List<String> uppercasedList = list.stream()
                                 .map(String::toUpperCase)
                                 .collect(Collectors.toList());
System.out.println("Uppercased List: " + uppercasedList);
  1. 平坦化(FlatMap):
java 复制代码
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);
  1. 筛选和截断(Limit和Skip):
java 复制代码
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);
  1. 排序(Sorted):
java 复制代码
List<String> sortedList = list.stream()
                             .sorted()
                             .collect(Collectors.toList());
System.out.println("Sorted List: " + sortedList);
  1. 匹配(anyMatch、allMatch、noneMatch):
java 复制代码
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);
  1. 归约(Reduce):
    将字符串列表中的所有元素连接成一个单一的字符串,以逗号和空格分隔。
java 复制代码
Optional<String> concatenated = list.stream().reduce((s1, s2) -> s1 + ", " + s2);
concatenated.ifPresent(result -> System.out.println("Concatenated: " + result));
  1. 收集(Collect):
java 复制代码
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 的优点和解决的问题,并附带一些案例:

  1. 声明式编程:

    • 问题:传统方式对集合的操作通常需要使用迭代器或者显式的循环,导致代码冗长且难以理解。
    • 解决方案:Stream 提供了声明式的编程方式,可以更清晰地表达对集合的操作。
    java 复制代码
    List<String> fruits = Arrays.asList("apple", "banana", "orange");
    fruits.stream().filter(s -> s.startsWith("a")).forEach(System.out::println);
  2. 链式调用:

    • 问题:在传统方式中,对集合的多次操作需要多次迭代或多次循环,效率低下。
    • 解决方案:Stream 支持链式调用,可以在一次迭代中执行多个操作。
    java 复制代码
    List<String> result = fruits.stream()
                               .filter(s -> s.startsWith("a"))
                               .map(String::toUpperCase)
                               .collect(Collectors.toList());
  3. 不可变性和延迟执行:

    • 问题:传统方式中的集合操作可能会改变原集合,或者在每一步都立即执行。
    • 解决方案:Stream 操作不会改变原集合,而是返回一个新的 Stream,并且操作是延迟执行的。
    java 复制代码
    List<String> result = fruits.stream()
                               .filter(s -> s.startsWith("a"))
                               .map(String::toUpperCase)
                               .collect(Collectors.toList());
  4. 并行处理:

    • 问题:在传统方式中,手动编写并行化代码可能会很困难。
    • 解决方案:Stream 提供了简便的方法来实现并行处理,提高了性能。
    java 复制代码
    long count = fruits.parallelStream().filter(s -> s.startsWith("a")).count();
  5. 简化聚合操作:

    • 问题:传统方式中聚合操作(如求和、平均值)需要编写显式的循环代码。
    • 解决方案:Stream 提供了内置的聚合操作,简化了这类操作。
    java 复制代码
    double averageLength = fruits.stream().mapToInt(String::length).average().orElse(0);

这些案例展示了 Stream 如何解决传统集合操作中的一些问题,并提供了更简洁、清晰和高效的处理方式。通过使用 Stream,代码变得更加表达力强,可读性更高,并且在某些情况下能够更容易地实现并行化。

相关推荐
野生技术架构师几秒前
Tomcat Service的设计和实现:StandardService
java·tomcat
Gofarlic_OMS10 分钟前
UG/NX许可证管理高频技术问题解答汇编
java·大数据·运维·服务器·汇编·人工智能
逐星ing15 分钟前
IDEA 无法识别 `mvn install` 最新 SNAPSHOT 依赖的根因与完整解决方案
java·ide·intellij-idea
流觞 无依22 分钟前
Spring Boot 未授权访问漏洞排查与修复指南
java·spring boot·后端
Java开发的小李24 分钟前
SpringBoot 高流量高并发 基础全面讲解
java·spring boot·后端·性能优化
随风,奔跑30 分钟前
Spring Cloud Alibaba(六)-链路追踪SkyWalking
java·后端·spring·skywalking
wuminyu32 分钟前
专家视角看Lambda表达式的原理解析
java·linux·c语言·jvm·c++
wangbing112534 分钟前
Java处理csv文件总是丢数据
java·开发语言·python
云烟成雨TD35 分钟前
Spring AI 1.x 系列【30】向量数据库:核心 API 和入门案例
java·人工智能·spring
许彰午1 小时前
CacheSQL:一个面向政务系统的内存缓存数据库中间件
java·数据库·缓存·中间件·面试·开源软件·政务