📜  Java流Stream(1)

📅  最后修改于: 2023-12-03 15:32:04.014000             🧑  作者: Mango

Java流Stream

Java流(Stream)是一种用于处理集合数据类型的API。它提供了一种非常简洁、灵活且高效的方式来处理元素集合,它的本质是依托于迭代器实现的数据消费模型。Stream API具有无状态、行为参数化和惰性求值的特性,这些特性使得Stream API用起来非常方便和高效。

Stream的创建

Java的Stream API支持三种类型的数据集合类型的流操作:

  1. 集合:像List、Set、Queue等Java集合框架能够支持的所有集合类型都可以转换成流。

  2. 数组:Java中的数组可以作为Stream API的数据源。

  3. I/O channel:Java NIO中的codecs、buffers、selectors可以与Stream API一起使用。

Stream API提供了许多静态方法帮助我们创建流:

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
Stream<Integer> stream = list.stream();
String[] array = new String[]{"hello", "world", "stream"};
Stream<String> stream = Arrays.stream(array);
Stream<String> stream = Files.lines(Paths.get("file.txt"));
Stream的中间操作

Stream的中间操作方法可以进一步细分为两种类型,它们分别是:

  1. 过滤器(Filtering):Stream可以通过filter(filter)方法过滤一些不需要的元素,只取出需要的元素。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

Stream<Integer> stream = list.stream().filter(i -> i % 2 == 0);
//输出结果为:2, 4, 6, 8, 10
  1. 映射(Mapping):Stream可以通过map(map)方法将一个元素转成另外一个元素。比如,将一个字符串转换成全大写的字符串。
List<String> list = Arrays.asList("hello", "world", "stream");

Stream<String> stream = list.stream().map(String::toUpperCase);
//输出结果为:HELLO, WORLD, STREAM
Stream的最终操作

Stream提供了一种方法来完成我们对集合数据的处理和操作,这种方法被称为Termination操作。这些操作将流处理成另外一个类型的值,或者通过forEach操作来改变流集合数据类型的值。

  1. 收集(Collecting):Stream可以通过collect(Collectors)方法将一个Stream的结果集收集起来,转换为指定的集合类型,如List、Set等。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

List<Integer> evenNumbers = list.stream()
        .filter(i -> i % 2 == 0)
        .collect(Collectors.toList());
String[] array = new String[]{"hello", "world", "stream"};

Set<String> set = Arrays.stream(array)
        .map(String::toUpperCase)
        .collect(Collectors.toSet());
  1. 聚合(Aggregating):Stream可以通过reduce(reduce)操作将元素汇聚成一个汇总结果。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

Optional<Integer> result = list.stream().reduce((x, y) -> x + y);
//输出结果为: 55
  1. 匹配(Matching):Stream可以通过match(match)操作来检测集合元素是否符合指定断言。
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

boolean allEven = list.stream().allMatch(i -> i % 2 == 0);
//输出结果为: false
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

boolean anyEven = list.stream().anyMatch(i -> i % 2 == 0);
//输出结果为: true
List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

boolean noneMatch = list.stream().noneMatch(i -> i % 2 == 0);
//输出结果为: false
总结

通过Stream API的操作,我们可以大大简化对集合类型数据的过滤、映射、聚合、匹配等处理操作。通过使用Stream API,我们可以提高代码的可读性、可维护性和重复性。