功能篇:JAVA8实现数据去重

news/2024/12/26 2:07:53/

在Java 8中,有多种方法可以实现集合的去重。下面我将介绍几种常见的方法:

### 使用`Set`接口
最简单的方法是使用`Set`接口,因为根据定义,`Set`不允许重复元素。如果你有一个`List`并且想要去除其中的重复项,你可以将其转换为一个`Set`。

```java
import java.util.*;

List<String> listWithDuplicates = Arrays.asList("a", "b", "c", "a", "b");
Set<String> setWithoutDuplicates = new HashSet<>(listWithDuplicates);
// 如果需要保持插入顺序,可以使用 LinkedHashSet
// Set<String> setWithoutDuplicates = new LinkedHashSet<>(listWithDuplicates);

// 转换回 List(如果需要)
List<String> listWithoutDuplicates = new ArrayList<>(setWithoutDuplicates);
```

### 使用`Stream API`
Java 8 引入了流式处理,可以通过`distinct()`方法来去除流中的重复元素。

```java
import java.util.*;
import java.util.stream.Collectors;

List<String> listWithDuplicates = Arrays.asList("a", "b", "c", "a", "b");
List<String> listWithoutDuplicates = listWithDuplicates.stream()
    .distinct()
    .collect(Collectors.toList());
```

### 基于自定义对象的去重
如果你的对象不是基本类型或字符串,而是你自己创建的类,并且你想要基于某些字段去重,你可以这样做:

```java
import java.util.*;
import java.util.stream.Collectors;

class MyObject {
    private String key;
    // constructor, getters, equals and hashCode methods...
}

List<MyObject> listWithDuplicates = ... // 初始化你的列表

// 使用 stream 和 distinct(),但是需要确保 MyObject 正确实现了 equals 和 hashCode 方法
List<MyObject> listWithoutDuplicates = listWithDuplicates.stream()
    .distinct()
    .collect(Collectors.toList());

// 或者,如果你想要基于特定属性去重,可以这样:
Map<String, MyObject> map = listWithDuplicates.stream()
    .collect(Collectors.toMap(MyObject::getKey, obj -> obj, (existing, replacement) -> existing));

List<MyObject> listWithoutDuplicatesBasedOnKey = new ArrayList<>(map.values());
```

请注意,当你使用`distinct()`方法时,它依赖于对象的`equals()`和`hashCode()`方法。因此,如果你要对自定义对象进行去重,你需要确保这些方法被正确地覆盖。

选择哪种方法取决于你的具体需求,例如是否需要保留原始顺序、性能考虑等。


http://www.ppmy.cn/news/1558145.html

相关文章

蓝桥杯摆烂第三天

小蓝给学生们组织了一场考试&#xff0c;卷面总分为 100 分&#xff0c;每个学生的得分都是一个 0 到 100 的整数。 请计算这次考试的最高分、最低分和平均分。 输入描述 输入的第一行包含一个整数 n (1≤n≤104)&#xff0c;表示考试人数。 接下来 n 行&#xff0c;每行包…

【C++】sophus : sim_details.hpp 实现了矩阵函数 W、其导数,以及其逆 (十七)

这段代码主要用于计算与旋转矩阵和指数相关的矩阵运算&#xff0c;是Sophus库的一部分&#xff0c;Sophus是用于几何运算的C库。以下是对代码的总结&#xff1a; 主要功能 calcW: 计算矩阵W&#xff0c;该矩阵与旋转矩阵和指数有关。根据不同的theta和sigma值&#xff0c;进行特…

CPU性能优化-磁盘空间和解析时间

即使考虑了跟踪文件的压缩格式&#xff0c;编码后的数据仍然会占用很大的磁盘空间。通常&#xff0c;每条指令不超过1字节&#xff0c;但是考虑到CPU执行指令的速度&#xff0c;数据仍然非常多。根据负载&#xff0c;CPU编码以100MB/s的速度处理PT跟踪文件的情况是很常见的&…

【蓝桥杯每日一题】分糖果——DFS

分糖果 蓝桥杯每日一题 2024-12-24 分糖果 DFS 题目描述 两种糖果分别有 9 个和 16 个&#xff0c;要全部分给 7 个小朋友&#xff0c;每个小朋友得到的糖果总数最少为 2 个最多为 5 个&#xff0c;问有多少种不同的分法。糖果必须全部分完。 只要有其中一个小朋友在两种方案中…

重温设计模式--代理模式

文章目录 定义UML图代理模式主要有以下几种常见类型&#xff1a;代理模式涉及的主要角色有&#xff1a;C 代码示例 定义 代理模式&#xff08;Proxy Pattern&#xff09;属于结构型设计模式&#xff0c;它为其他对象提供一种代理以控制对这个对象的访问。 通过引入代理对象&am…

Java复习|图形用户界面AWT、Swing----银行客户管理系统【校课版】【1】

校课总结&#xff0c;部分&#xff0c;未完待续...... 背景了解 Java的AWT和Swing的现状 AWT&#xff08;Abstract Window Toolkit&#xff09; AWT是Java中最早期的图形用户界面&#xff08;GUI&#xff09;工具包&#xff0c;它直接与操作系统提供的图形函数进行交互&a…

图解HTTP-HTTP状态码

状态码 状态码的职责是当客户端向服务器端发送请求时&#xff0c;描述返回的请求结果。 类别原因短语1XXInformational(信息状态码)接收的请求正在处理2XXSuccess&#xff08;成功状态码&#xff09;请求正常处理完毕4XXRedirection &#xff08;重定向状态码&#xff09;需要…

python-hello(黑马程序员B站视频 第一章内容总结)

下面我们来简单总结一下看黑马程序员视频–python的一个总结. 感觉第一章没什么好总结的, 但是为了文章的连续性这里也还是写一写吧~ 黑马的视频链接: https://www.bilibili.com/video/BV1qW4y1a7fU/?spm_id_from333.999.0.0 目录 1. 简单介绍一下python1.1 python的起源1.2 p…