Java中Stream操作

打印 上一主题 下一主题

主题 1059|帖子 1059|积分 3177

Java中Stream操作

Stream 和 Optional区别


  • 用途不同:Stream 用于处理集合中的元素序列,支持丰富的中间操作和终端操作;Optional 用于体现一个值可能为 null 的情况,提供了一种更优雅的处理方式。
  • 数据处理 vs. 容器:Stream 是处理数据流的工具,而 Optional 是一个容器,用于可能缺少值的情况。
  • API风格:Stream 使用函数式编程风格举行操作,Optional 提供了对值举行安全处理的函数式方法。
   在现实开辟中,Stream 和 Optional 经常共同使用,Stream 可能包含 Optional 对象,以处理可能为 null 的元素,从而有效地进步代码的安全性和可读性。
  generate

产生随机数字流,会一直输出
  1. Stream<Double> stream = Stream.generate(Math::random);
  2. stream.forEach(System.out::println);
复制代码
iterate

一直循环添加
  1. Stream<BigInteger> stream = Stream.iterate(BigInteger.ZERO, n -> n.add(BigInteger.ONE));
  2. stream.forEach(System.out::println);
复制代码
of和limit

  1. // 创建指定长度随机数
  2. List<Double> list = Stream.generate(Math::random).limit(10).toList();
  3. list.forEach(System.out::println);
  4. // 创建不好喊任何元素的流
  5. Stream<Object> empty = Stream.empty();
  6. empty.forEach(System.out::println);
  7. // 创建一个给定值的流
  8. Stream<Integer> integerStream = Stream.of(1, 2, 3, 4, 5, 6);
  9. integerStream.forEach(System.out::println);
  10. // 使用 ofNullable 创建一个流,如果值为 null 则创建一个空流
  11. Stream<String> stream = Stream.ofNullable("hello");
  12. stream.forEach(System.out::println);
复制代码
文件流

输入这个文件中的每一行
  1. var lines = Files.lines(Path.of("D:\\Project\\demo\\sharding-sphere5\\service\\src\\test\\java\\cn\\bunny\\stream\\StreamTest.java"));
  2. lines.forEach(System.out::println);
  3. lines.close();
复制代码
带map相干

  1. List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
  2. // Map处理数据
  3. var list = numbers.stream().map(number -> number * 2).toList();
  4. System.out.println(list);
  5. // 扁平化数据
  6. List<List<Integer>> nestedNumbers = Arrays.asList(
  7.         Arrays.asList(1, 2, 3),
  8.         Arrays.asList(4, 5),
  9.         Arrays.asList(6, 7, 8)
  10. );
  11. System.out.println("原始数据:" + nestedNumbers);
  12. var integerList = nestedNumbers.stream().flatMap(List::stream).toList();
  13. System.out.println(integerList);
  14. // 将每个字符串拆分为字符并输出
  15. Stream<String> stream = Stream.of("apple", "banana", "cherry");
  16. List<Object> objectList1 = stream.mapMulti((str, consumer) -> {
  17.     System.out.println(str);
  18.     for (char c : str.toCharArray()) {
  19.         consumer.accept(c);
  20.     }
  21. }).toList();
  22. System.out.println(objectList1);
  23. // 使用 mapMulti 方法处理流中的元素
  24. Stream<Integer> integerStream = Stream.of(1, 2, 3);
  25. var objectList = integerStream.mapMulti((num, consumer) -> {
  26.     // [1, 1, 4, 8, 9, 27]
  27.     consumer.accept(num * num);
  28.     consumer.accept(num * num * num);
  29. }).toList();
  30. System.out.println(objectList);
复制代码
limit

在需要仅处理流中前几个元素时,可以使用 limit 方法。
  1. Stream<Integer> stream = Stream.iterate(0, i -> i + 1);
  2. Stream<Integer> limit = stream.limit(5);
  3. limit.forEach(System.out::println);
复制代码
skip

在需要跳过流中的前几个元素后处理后续元素时,可以使用 skip 方法。
  1. Stream<Integer> stream = Stream.iterate(0, i -> i + 1);
  2. Stream<Integer> skip = stream.skip(3);
  3. skip.forEach(System.out::println);
复制代码
takeWhile

在需要根据条件获取流中开头满足条件的元素时,可以使用 takeWhile 方法。
  1. Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);
  2. Stream<Integer> integerStream = stream.takeWhile(num -> num < 4);
  3. integerStream.forEach(System.out::println);
复制代码
dropWhile

  1. Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5, 6);
  2. stream.dropWhile(num -> num < 4).forEach(System.out::println);
复制代码
concat

在需要将两个流归并成一个流时,可以使用 concat 方法。
  1. Stream<Integer> stream1 = Stream.of(1, 2, 3);
  2. Stream<Integer> stream2 = Stream.of(4, 5, 6);
  3. Stream<Integer> concatenatedStream = Stream.concat(stream1, stream2);
  4. concatenatedStream.forEach(System.out::println);
复制代码
distinct

在需要从流中去除重复元素时,可以使用 distinct 方法。
  1. Stream<String> stream = Stream.of("apple", "banana", "apple", "orange", "banana");
  2. stream.distinct().forEach(System.out::println);
复制代码
sorted

默认情况下,sorted 方法会按自然顺序对元素举行升序排序。如果需要降序排序,可以使用 sorted(Comparator.reverseOrder());返回负数是升序
  1. // 当条件是负数时是升序还是降序、相等不变这句话对吗?
  2. // 当使用 sorted 方法时,负数会被认为是比正数更小,所以如果排序条件是负数,它会被放在最前面,因此会是升序排序。
  3. // 相等不变这句话通常是指排序时相等的元素在排序后的顺序不变,这在 Java 中是成立的。
  4. Stream<Integer> stream = Stream.of(3, 1, 4, 1, 5, 9, 2, 6);
  5. stream.sorted().forEach(System.out::println);
复制代码
peek

在需要在流的处理过程中查看元素但不改变流本身时,可以使用 peek 方法。
  1. Stream<Integer> stream = Stream.of(1, 2, 3, 4, 5);
  2. stream.peek(System.out::println).forEach(integer -> {
  3. }); // 迭代所有元素
  4. stream.close(); // 在所有操作完成后关闭流
复制代码
max和min

这两个方法用于获取流中的最大值和最小值。它们通常用于包含可比较元素的流。
  1. Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5);
  2. // 获取流中的最大值
  3. Integer max = numbers.max(Integer::compareTo).orElse(0);
  4. System.out.println("Max value: " + max);
  5. // 最小值
  6. Stream<Integer> numbers2 = Stream.of(1, 2, 3, 4, 5);
  7. Integer min = numbers2.min(Integer::compareTo).orElse(0);
  8. System.out.println("Min value: " + min);
复制代码
find

这两个方法用于从流中获取元素。findFirst 返回流中的第一个元素,而 findAny 返回流中的任意一个元素(在并行流中更有用)。
  1. Stream<String> strings = Stream.of("apple", "banana", "cherry");
  2. // 找到第一个元素
  3. Optional<String> firstElement = strings.findFirst();
  4. System.out.println("First element: " + firstElement.orElse("No element found"));
  5. // 找到任意一个元素
  6. Stream<String> strings2 = Stream.of("apple", "banana", "cherry");
  7. Optional<String> anyElement = strings2.findAny();
  8. System.out.println("Any element: " + anyElement.orElse("No element found"));
复制代码
Match

anyMatch:判定流中是否至少有一个元素满足条件。
allMatch:判定流中的所有元素是否都满足条件。
noneMatch:判定流中是否所有元素都不满足条件。
  1. // 检查是否有元素大于3
  2. Stream<Integer> numbers = Stream.of(1, 2, 3, 4, 5);
  3. boolean anyGreaterThanThree = numbers.anyMatch(num -> num > 3);
  4. System.out.println("Any number greater than 3: " + anyGreaterThanThree);
  5. // 检查是否所有元素都小于10
  6. Stream<Integer> numbers2 = Stream.of(1, 2, 3, 4, 5);
  7. boolean allLessThanTen = numbers2.allMatch(num -> num < 10);
  8. System.out.println("All numbers less than 10: " + allLessThanTen);
  9. // 检查是否所有元素都不等于0
  10. Stream<Integer> numbers3 = Stream.of(1, 2, 3, 4, 5);
  11. boolean noneEqualToZero = numbers3.noneMatch(num -> num == 0);
  12. System.out.println("No numbers equal to zero: " + noneEqualToZero);
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

鼠扑

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表