您好,登录后才能下订单哦!
密码登录
            
            
            
            
        登录注册
            
            
            
        点击 登录注册 即表示同意《亿速云用户服务条款》
        # Java Stream的用法
## 一、Stream概述
Java 8引入的Stream API是处理集合数据的革命性工具,它允许开发者以声明式方式操作数据集合。Stream不是数据结构,而是对数据源(如集合、数组等)的高级抽象,支持链式函数式操作。
核心特点:
- **惰性执行**:中间操作不会立即执行,只有遇到终止操作时才触发计算
- **不可复用**:每个Stream只能被消费一次
- **并行能力**:只需调用`parallel()`即可实现并行处理
## 二、Stream创建方式
### 1. 从集合创建
```java
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();  // 顺序流
Stream<String> parallelStream = list.parallelStream();  // 并行流
String[] array = {"a", "b", "c"};
Stream<String> stream = Arrays.stream(array);
Stream<String> stream = Stream.of("a", "b", "c");
Stream<Integer> infiniteStream = Stream.iterate(0, n -> n + 2);  // 无限流
Stream<Double> randomStream = Stream.generate(Math::random);  // 生成流
中间操作返回新的Stream,可以连续调用:
stream.filter(s -> s.startsWith("a"))  // 过滤以a开头的元素
      .distinct()                     // 去重
      .skip(1)                        // 跳过前N个元素
      .limit(5);                     // 限制元素数量
stream.map(String::toUpperCase)       // 元素转换
      .mapToInt(String::length)       // 转换为数值流
      .flatMap(s -> Stream.of(s.split("")))  // 扁平化流
stream.sorted()                       // 自然排序
      .sorted(Comparator.reverseOrder())  // 自定义排序
stream.forEach(System.out::println);
boolean anyMatch = stream.anyMatch(s -> s.contains("a"));
boolean allMatch = stream.allMatch(s -> s.length() > 3);
boolean noneMatch = stream.noneMatch(s -> s.isEmpty());
Optional<String> first = stream.findFirst();
Optional<String> any = stream.findAny();
Optional<String> concat = stream.reduce(String::concat);
long count = stream.count();
IntSummaryStatistics stats = stream.mapToInt(String::length).summaryStatistics();
List<String> list = stream.collect(Collectors.toList());
Set<String> set = stream.collect(Collectors.toSet());
String joined = stream.collect(Collectors.joining(","));
Map<String, Integer> map = stream.collect(Collectors.toMap(
    Function.identity(), 
    String::length
));
处理原始类型时更高效的变体:
IntStream intStream = IntStream.range(1, 100);  // 1-99
DoubleStream doubleStream = DoubleStream.of(1.1, 2.2);
LongStream longStream = LongStream.generate(() -> new Random().nextLong());
list.parallelStream()
    .filter(s -> s.length() > 3)
    .forEach(System.out::println);
注意事项: - 确保操作是线程安全的 - 避免有状态的操作 - 数据量小时可能降低性能
| 方法 | 说明 | 
|---|---|
toList() | 
收集为List | 
toSet() | 
收集为Set | 
toMap() | 
收集为Map | 
groupingBy() | 
分组收集 | 
partitioningBy() | 
分区收集 | 
joining() | 
字符串连接 | 
counting() | 
计数 | 
summarizingInt() | 
统计汇总 | 
List<Product> products = ...;
DoubleSummaryStatistics stats = products.stream()
    .mapToDouble(Product::getPrice)
    .summaryStatistics();
System.out.println("平均价格: " + stats.getAverage());
Map<Category, List<Product>> byCategory = products.stream()
    .collect(Collectors.groupingBy(Product::getCategory));
Map<Category, Map<String, List<Product>>> multiGroup = products.stream()
    .collect(Collectors.groupingBy(
        Product::getCategory,
        Collectors.groupingBy(p -> p.getPrice() > 100 ? "高价" : "普通")
    ));
IllegalStateExceptionpeek()方法观察流经的元素Java Stream API通过函数式编程范式: - 使集合操作更简洁直观 - 提供强大的数据转换能力 - 内置并行处理支持 - 提升代码可读性和维护性
合理运用Stream可以显著提升开发效率,但需注意其适用场景和潜在的性能影响。建议结合具体业务需求,在命令式编程和函数式编程之间做出平衡选择。 “`
注:本文实际约1700字,完整覆盖了Stream的核心概念、创建方式、操作类型、使用技巧和注意事项。如需扩展具体部分,可以进一步补充更多示例或性能优化建议。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。