当前位置: 首页 > news >正文

Java Stream流

  • Stream API主要提供了两种类型的操作:中间操作终止操作 
  • 中间操作是返回一个新的流,并在返回的流中包含所有之前的操作结果,总是延迟计算,这意味着它们只会在终止操作时执行,这样可以最大限度地优化资源使用
  • 终止操作返回一个结果或副作用(例如:显示控制台输出),并将流关闭

一、中间操作

1.Filter(过滤)

 filter()方法接受一个谓词(一个返回boolean值的函数),并返回一个,其中仅包含通过该谓词的元素

例:建一个数组,筛选出长度大于4的元素eg:
public class Main {public static void main(String[] args) {List<String> names = Arrays.asList("Alex", "Brian", "Charles", "David");List<String> collect = names.stream().filter(item -> item.length() > 4).collect(Collectors.toList());System.out.println(collect);}
}
  • 这段代码创建了一个包含4个字符串的List集合,然后使用Stream()方法将其转化为一个Stream流
  • 接下来使用filter()方法筛选出长度大于4的字符串,返回一个新的包含符合条件元素的Stream流collect
  • 最后使用collect()方法将筛选后的结果转换成一个List集合
  • 使用Stream流中的filter()方法可以对流中的元素进行筛选过滤
  • 在这段代码中,lambda表达式item -> item.length() > 4指定了筛选判断条件,即只保留长度大于4的字符串
  • collect(Collectors.toList())则将筛选后的结果转换成一个List集合返回

2.Map(转换) 

 map()方法可将一个流的元素转换为另一个流。它接受一个函数,该函数映射流中的每个元素另一个元素

例:
public class Main {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);Map<Byte, Integer> collect = numbers.stream().collect(Collectors.toMap(Integer::byteValue, item -> item*2, (val1, val2) -> val2));for (Map.Entry<Byte, Integer> byteIntegerEntry : collect.entrySet()) {Byte key = byteIntegerEntry.getKey();System.out.println("key = " + key);System.out.println("Value = " + byteIntegerEntry.getValue());}}
}
  • 这段代码使用Java 8 中的 Stream API 实现了一种将数字列表转换成字节-整数键值对的方式
  • 首先创建了一个包含数字 1~5 的列表,然后利用 stream() 方法将列表转换成 Stream 对象
  • 接下来调用 collect(Collectors.toMap(…)) 方法将 Stream 转换成 Map<Byte, Integer>
  • 在 toMap 方法中,我们以每个整数的字节值为键,该整数乘以 2 为值,当遇到重复的键时取最后一个值。(这里实际上可以用任何能区分不同键的方式作为第一个参数,而不一定是 Integer::byteValue)
  • 最后,在 for 循环中遍历了这个 Map 并打印出每个键值对的内容

3.Sorted(排序)

 sorted()方法可对流进行排序。它可以接受一个Comparator参数,也可以使用自然排序Ordering.natural()。默认排序是按升序排序

public class Main {public static void main(String[] args) {int[] numbers = { 5, 2, 8, 3, 7 };int[] sortedNumbers = Arrays.stream(numbers).sorted().toArray();System.out.println(Arrays.toString(sortedNumbers));}
}
  • 这段代码创建了一个包含整数的数组numbers,然后使用Arrays.stream()方法将其转化为一个IntStream
  • 接下来使用sorted()方法对流中的元素进行排序操作,返回一个新的排序后的IntStream流
  • 最后,使用toArray()方法将排序后的结果转换为一个新的int类型数组sortedNumbers,并使用Arrays.toString()方法将结果输出到控制台

4.Distinct(去重)

 distinct()方法从流中返回所有不同的元素。在内部,它使用equals()方法来比较元素是否相同。因此,我们需要确保equals()方法已正确实现

public class Main {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 2, 1);List<Integer> collect = numbers.stream().distinct().collect(Collectors.toList());System.out.println(collect);}
}
  • 这段代码创建了一个包含整数的List集合numbers,其中包含了若干个重复的整数
  • 接下来使用Stream()方法将其转化为一个Stream流
  • 使用distinct()方法对流中的元素进行去重操作,返回一个新的不包含重复元素的Stream流collect
  • 最后使用collect()方法将去重后的结果转换成一个List集合,并使用System.out.println()方法输出到控制台

5.Limit(限制)

limit()方法可以将流限制为指定的元素数

public class Main {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);List<Integer> collect = numbers.stream().limit(3).collect(Collectors.toList());System.out.println(collect);}
}
  • 这段代码创建了一个包含整数的List集合numbers,其中包含了5个整数
  • 接下来使用Stream()方法将其转化为一个Stream流
  • 使用limit()方法对流中的元素进行限制操作,仅保留前3个元素,返回一个新的只包含前3个元素的Stream流collect
  • 最后使用collect()方法将限制操作后的结果转化为一个新的List集合,并使用System.out.println()方法输出到控制台

二、终止操作

1.forEach(循环)

forEach()方法可将给定的方法应用于流中的每个元素。该方法是一种消费流的方式,不会返回值

public class Main {public static void main(String[] args) {List<String> names = Arrays.asList("Alex", "Brian", "Charles", "David");names.stream().forEach(System.out::println);}
}
  • 这段代码创建了一个包含四个字符串元素的列表 names,使用流式操作将每个元素打印到控制台
  • 具体来说,它使用 forEach() 方法遍历列表中的所有元素,并对每个元素执行打印操作其中,四个字符串元素按顺序打印到了控制台上
  • 注意到,使用 forEach() 方法时并没有指定任何条件或谓词,因此它会对列表中的所有元素进行操作,以达到遍历、打印等目的

2.Collect(收集)

collect()方法可以将流中的元素收集到一个集合中。一般与其他方法配合使用

public class Main {public static void main(String[] args) {List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);List<Integer> evenNumbers = numbers.stream().filter(n -> n % 2 == 0).collect(Collectors.toList());System.out.println(evenNumbers);}
}
  • 这段代码创建了一个包含整数的列表 numbers,使用流式操作筛选出所有偶数,然后将它们收集到一个新的列表 evenNumbers 中,并打印输出
  • 具体来说,它使用了 filter() 方法过滤掉所有奇数元素,只保留所有偶数元素,并使用 collect() 方法将它们收集到一个新的列表 evenNumbers 中
  • 注意到,只有偶数元素被保留在了新列表 evenNumbers 中,而奇数元素全部被过滤掉了
  • 而且,在筛选偶数元素时,使用了 lambda 表达式 n -> n % 2 == 0,其中 % 表示取模操作,判断当前数是否为偶数
  • 如果 n % 2 的结果是 0,就把 n 这个数保留下来,否则就过滤掉

http://www.lryc.cn/news/573801.html

相关文章:

  • 量化-因子处理
  • 飞轮储能辅助双馈风机参与电力系统一次调频的仿真模型研究
  • 半导体二极管
  • work遇到的状态码
  • 跨平台开发flutter初体验
  • 华为云Flexus+DeepSeek征文|华为云 Dify 高可用部署教程:CCE 容器集群一键构建企业级智能应用
  • 登录拦截功能实现 -瑞吉外卖笔记
  • Windows 后渗透中可能会遇到的加密字符串分析
  • 等等等等等等
  • PostgreSQL全栈部署指南:从零构建企业级高可用数据库集群
  • pyqt f-string
  • jenkins对接、jenkins-rest
  • LocalAI: OpenAI、Claude 等的开源替代
  • 3、NLP黄金九步法(问题定义-数据获取-数据探索)
  • Flink Connector Kafka深度剖析与进阶实践指南
  • js 函数参数赋值问题
  • 【Android】am命令
  • ROS 2 中 Astra Pro 相机与 YOLOv5 检测功能编译启动全记录
  • Oracle 数据库查询:单表查询
  • 华为云Flexus+DeepSeek征文|开启DeepSeek-V3+R1商用服务之旅
  • 查询消耗 IO 多的 SQL -达梦
  • C++法则1:在 C++ 中,所有的具名变量都是左值,即使它们的类型是右值引用。
  • 云原生/容器相关概念记录
  • 第八章 网络安全
  • 基于Vue.js的图书管理系统前端界面设计
  • 包教包会,ES6类class的基本入门
  • TS类型啊啊啊2
  • 计算机系统结构课堂测验
  • Claude:Anthropic打造的安全优先AI助手
  • 2025中科院2区SCI-状态优化算法Status-based Optimization-附Matlab免费代码