Java 8 Stream.distinct() 方法10 Sept 2024 | 4 分钟阅读 Java 8 的 distinct() 操作 主要与流(stream)相关,用于从流中删除重复的元素。Stream API 是在 Java 8 中引入的,它提供了一种更实用的与集合交互的方式,distinct() 操作就是其中的一部分。 语法distinct() 方法的目的distinct() 操作通过从流中删除重复的元素,确保结果中每个元素只出现一次。 distinct() 方法的应用1. 简单类型 在处理简单类型(如整数和字符串)时,distinct() 基于它们的相等性或自然顺序来比较元素。 2. 对象 对于自定义对象,distinct() 操作使用对象的 equals() 方法来确定相等性。 distinct() 方法的工作原理
下面我们将通过完整的代码示例,来了解 Java 8 的 distinct() 操作的各种用法。 1. 在 Java Stream 中使用 distinct() 方法在 Java Stream 中,可以使用 distinct() 方法从元素流中去除重复项。 Distinct.java 输出 List: [1, 2, 3, 4, 2, 3, 5, 6, 7, 8, 1] Distinct elements of the list: [1, 2, 3, 4, 5, 6, 7, 8] 解释 我们创建一个包含一些重复项的整数(数字)列表。使用 stream() 方法从列表中创建流。然后,流经过 distinct() 操作以去除重复项。最后,使用 collect(Collectors.toList()) 函数将流中的元素收集到一个新列表(distinctNumbers)中,并打印原始列表和去重后的列表。 2. 使用 distinct() 方法处理对象如果我们有一个自定义对象列表,并希望根据特定属性删除重复项,则可以结合使用 distinct() 和自定义比较器。 DistinctObjects.java 输出 Original List: [Person@6956de9, Person@769c9116, Person@6aceb1a5, Person@2d6d8735] Distinct List: [Person@6956de9, Person@769c9116, Person@6aceb1a5, Person@2d6d8735] 解释 我们创建一个包含一些重复项的 Person 对象列表,这些对象基于姓名和年龄数据。使用 stream() 函数将列表转换为 Person 对象流。使用默认的对象相等性检查(即 equals() 方法),distinct() 函数用于去除重复项。然后打印原始列表和去重后的列表,结果被收集到一个新列表(distinctPeople)中。 3. 使用 distinct() 方法处理复杂对象我们可以将 distinct() 与其他流操作结合使用,以处理更复杂的情况。 DistinctFlatMap.java 输出 Nested Lists: [[11, 22, 23], [22, 13, 24], [13, 34, 25]] Distinct Numbers in Nested Lists: [11, 22, 23, 13, 24, 34, 25] 解释 使用 stream() 方法将列表的列表转换为列表流。使用 flatMap(List::stream) 函数将嵌套列表展平成一个单一的整数流。通过 distinct() 技术实现重复数字的去除。当结果被收集到一个新列表(distinctNumbers)中时,将报告原始嵌套列表和去重后的数字。 结论总而言之,在函数式编程范式中,Java 8 Stream 中的 distinct() 方法是消除重复并保证唯一性的有用工具。它具有适应性,适用于不同类型的数据,并且其状态性被限制在操作内部,保持了流管道的整体无状态性。必须正确实现相等性测试,开发者还必须考虑性能,尤其是在处理大型或复杂数据集时。distinct() 操作是清理、预处理和维护数据集或流完整性的可行方法。 |
? Java 中的 main() 函数是任何独立应用程序的起点。默认情况下,"main" 线程是一个非守护线程,负责执行它。这意味着,在 main() 线程和所有非守护线程执行完毕之前,Java...
阅读 4 分钟
Java 是一种通用且强大的编程语言,以其健壮性和灵活性而闻名。使 Java 成为开发者热门选择的众多特性之一是动态初始化。动态初始化允许您在运行时初始化变量和对象,为您提供更大的...
阅读9分钟
在 Java 中,对象的大小是通过其实例变量大小的总和来确定的。然而,当涉及到空类,即没有示例变量的类别时,对于内存量有多少的问题没有明确的答案……
阅读 4 分钟
在编程世界中,null 值长期以来一直是令人沮丧的根源,导致 NullPointerException 导致应用程序崩溃并产生意外行为。为了解决这个问题,Java 在 Java 8 中引入了 Optional 类,提供了一个容器类型,该类型包含一个非 null...
阅读 4 分钟
SonarQube 是一个开源的静态测试分析软件。开发人员使用它来管理源代码的质量和一致性。一些代码质量检查包括:潜在的 bug 设计中的代码缺陷代码重复测试覆盖率不足过度复杂性静态测试这是一种在程序运行之前检查源代码的调试方法...
阅读 6 分钟
在 Java 中,查找数组中的第二大元素是一个常见问题,可以通过多种不同的方式解决。我们可以使用一次迭代遍历数组或对数组进行排序。这是查找第二大元素的最高效的方法……
阅读 8 分钟
? 在编程语言的广阔领域中,Java 以其通用性和平台无关性赢得了声誉。促成其巨大普及的关键因素之一是其对可移植性的承诺。但“可移植性”在 Java 的上下文中到底意味着什么,以及...
阅读 4 分钟
AES-GCM(高级加密标准-伽罗瓦/计数器模式)是一种广泛使用的对称密钥加密技术,它具有数据完整性和隐私性两项优势。在本节中,我们将探讨如何在 Java 中使用 AES-GCM 加密。AES-GCM 是一种数据块加密方法,属于 AES 系列。它……
阅读 4 分钟
它类似于 Java 中用于遍历源(集合、生成器函数或 IO 通道)元素的其他迭代器。Spliterator 是 Streams 的基础实用程序,尤其是并行 Streams。为了使用 Spliterator 处理集合,我们通过调用……来创建一个 Spliterator 对象。
阅读9分钟
由于强大的继承系统,Java 中的一个类可以通过继承另一个类的特征和行为。在处理继承时,构造函数对于初始化对象和维护类的正确运行至关重要。在本节中,我们将探讨构造函数的功能……
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India