如何用Java 11的Stream distinct函数验证任务列表中是否存在重复用户
Java 11 检查任务列表中是否存在重复用户
步骤1:定义数据实体类
用Java 11的record(轻量数据载体)匹配JSON结构:
public record User(String username) {} public record Task(int id, List<User> users) {} public record TaskList(List<Task> tasks) {}
步骤2:实现重复检查逻辑
利用Stream API扁平化所有用户列表,通过Set的去重特性判断是否存在重复:
import java.util.List; import java.util.Set; import java.util.stream.Collectors; public class DuplicateUserChecker { public static boolean hasDuplicateUsers(TaskList taskList) { // 提取所有非空用户名并去重 Set<String> uniqueUsernames = taskList.tasks().stream() .flatMap(task -> task.users().stream()) .map(User::username) .filter(username -> username != null) // 过滤空用户名 .collect(Collectors.toSet()); // 统计所有非空用户名的总数 long totalValidUsernames = taskList.tasks().stream() .flatMap(task -> task.users().stream()) .map(User::username) .filter(username -> username != null) .count(); // 总数与去重后数量不一致则存在重复 return totalValidUsernames != uniqueUsernames.size(); } public static void main(String[] args) { // 模拟示例数据测试 User user1 = new User("username1"); User user2 = new User("username1"); User user3 = new User("username2"); Task task1 = new Task(1, List.of(user1)); Task task2 = new Task(2, List.of(user2, user3)); TaskList taskList = new TaskList(List.of(task1, task2)); System.out.println(hasDuplicateUsers(taskList)); // 输出 true } }
可选:解析JSON数据
若需从JSON文件/字符串加载数据,可使用Jackson库(需引入依赖):
Maven依赖
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.15.2</version> </dependency>
解析代码
import com.fasterxml.jackson.databind.ObjectMapper; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; public class TaskListParser { public static void main(String[] args) throws IOException { // 读取JSON文件内容 String jsonContent = Files.readString(Paths.get("tasks.json")); // 解析为TaskList对象 ObjectMapper mapper = new ObjectMapper(); TaskList taskList = mapper.readValue(jsonContent, TaskList.class); // 检查重复用户 boolean hasDuplicates = DuplicateUserChecker.hasDuplicateUsers(taskList); System.out.println("是否存在重复用户:" + hasDuplicates); } }
额外说明
- 大小写敏感处理:若需忽略用户名大小写(如
Username1和username1视为重复),可在提取用户名时统一转换:.map(user -> user.username().toLowerCase()) - 空值处理:示例过滤了
null用户名,若需将多个null视为重复,移除filter操作即可。
内容的提问来源于stack exchange,提问作者Luiz Ricardo Cardoso
相关产品推荐
相关产品推荐

