# JAVA中的Stream学习

JAVA中的Stream

1、Stream是什么?

  • Stream 是 Java 8 引入的一个新的抽象层,用于处理数据集合。
  • 它可以让你以声明式的方式处理数据,类似于 SQL 语句的查询方式。

2、Stream能够做什么?

  • 过滤:通过条件筛选数据。
  • 映射:转换数据结构或类型。
  • 排序:对数据进行排序。
  • 聚合:如求和、最大值、最小值等。
  • 匹配与查找:检查某些条件是否满足,或者查找特定元素。

3、Stream能给我带来什么好处?

  • 简洁性:使用 Stream 可以让代码更加简洁、易读。
  • 高效性:Stream 操作可以自动并行化,提高处理效率。
  • 声明式编程:关注“做什么”而不是“怎么做”,降低出错概率。

4、Stream怎么使用?

1. 创建 Stream

从集合创建
List<String> list = Arrays.asList("a", "b", "c");
Stream<String> stream = list.stream();
从数组创建
int[] array = {1, 2, 3};
IntStream stream = Arrays.stream(array);
从文件创建
try (Stream<String> lines = Files.lines(Paths.get("file.txt"))) {
    lines.forEach(System.out::println);
} catch (IOException e) {
    e.printStackTrace();
}

2. 中间操作

filter

  • 功能:过滤元素,只保留满足条件的元素。
  • 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> shortNames = names.stream()
                               .filter(name -> name.length() < 5)
                               .collect(Collectors.toList());

map

  • 功能:转换元素,将每个元素映射为另一个元素。
  • 示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
List<Integer> squares = numbers.stream()
                               .map(n -> n * n)
                               .collect(Collectors.toList());

flatMap

  • 功能:将多个流合并成一个流。
  • 示例:
List<List<Integer>> listOfLists = Arrays.asList(
    Arrays.asList(1, 2),
    Arrays.asList(3, 4)
);
List<Integer> flattenedList = listOfLists.stream()
                                         .flatMap(List::stream)
                                         .collect(Collectors.toList());

distinct

  • 功能:去重,去除重复的元素。
  • 示例:
List<Integer> numbers = Arrays.asList(1, 2, 2, 3, 4, 4);
List<Integer> uniqueNumbers = numbers.stream()
                                     .distinct()
                                     .collect(Collectors.toList());

sorted

  • 功能:排序,对元素进行排序。
  • 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> sortedNames = names.stream()
                                .sorted()
                                .collect(Collectors.toList());

limit

  • 功能:限制流的大小,返回前 n 个元素。
  • 示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> firstFive = numbers.stream()
                                 .limit(5)
                                 .collect(Collectors.toList());

skip

  • 功能:跳过前 n 个元素。
  • 示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
List<Integer> afterFirstFive = numbers.stream()
                                      .skip(5)
                                      .collect(Collectors.toList());

3. 终端操作

forEach

  • 功能:遍历流中的每个元素。
  • 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream().forEach(System.out::println);

collect

  • 功能:收集结果,将流转换为其他形式的数据结构。
  • 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
List<String> filterNames = names.stream()
                               .filter(name -> name.length() < 5)
                               .collect(Collectors.toList());

reduce

  • 功能:聚合操作,将流中的元素减少为一个值。
  • 示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
int sum = numbers.stream().reduce(0, Integer::sum);

anyMatch

  • 功能:检查流中是否有任何元素满足给定的条件。
  • 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
boolean anyStartsWithA = names.stream()
                              .anyMatch(name -> name.startsWith("A"));

allMatch

  • 功能:检查流中所有元素是否都满足给定的条件。
  • 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
boolean allStartWithA = names.stream()
                             .allMatch(name -> name.startsWith("A"));

noneMatch

  • 功能:检查流中没有任何元素满足给定的条件。
  • 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
boolean noneStartWithZ = names.stream()
                              .noneMatch(name -> name.startsWith("Z"));

findFirst

  • 功能:返回流中的第一个元素。
  • 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
Optional<String> first = names.stream()
                              .findFirst();

findAny

  • 功能:返回流中的任意一个元素。
  • 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
Optional<String> any = names.stream()
                            .findAny();

count

  • 功能:返回流中元素的数量。
  • 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
long count = names.stream()
                  .count();

max

  • 功能:返回流中的最大值。
  • 示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
Optional<Integer> max = numbers.stream()
                               .max(Integer::compare);

min

  • 功能:返回流中的最小值。
  • 示例:
List<Integer> numbers = Arrays.asList(1, 2, 3, 4);
Optional<Integer> min = numbers.stream()
                               .min(Integer::compare);

toArray

  • 功能:将流转换为数组。
  • 示例:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
String[] array = names.stream()
                      .toArray(String[]::new);

5、Stream的原理是什么?

  • 惰性求值:中间操作不会立即执行,只有在终端操作时才会触发整个流水线的执行。
  • 内部迭代:由系统控制迭代过程,而不是显式地编写循环。
  • 并行处理:支持并行流,可以通过 parallelStream() 方法实现。
  • 操作类型:中间操作返回新的 Stream,终端操作触发执行并产生结果。
  • 生命周期:从创建到中间操作再到终端操作,形成完整的流处理流程。

6、Stream总结

  • Stream 是 Java 8 引入的强大工具,简化了集合数据的处理。
  • 通过声明式编程风格,使代码更加简洁、易读。
  • 支持惰性求值和内部迭代,提高了性能和并发处理能力。
  • 在实际开发中,合理使用 Stream 可以显著提升开发效率和代码质量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值