You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Java 8(含Stream)检测JSON数组中bookID重复项

检测JSON数组中重复的bookID(Java 8 Stream实现)

首先给出输入的JSON结构:

{
  "ID" : "ID1",
  "books" : [ {
     "bookID" : "book1",
     "booktype": "pdf"
   },{
     "bookID" : "book2",
     "booktype": "txt"
   },{
     "bookID" : "book1",
     "booktype": "txt"
  }
 ]
}

要检测其中是否存在重复的bookID,步骤分为JSON解析和Stream重复检测两部分,以下是具体实现:

1. 定义对应Java实体类

先创建和JSON结构匹配的实体类,方便解析后操作:

import java.util.List;

class Library {
    private String ID;
    private List<Book> books;

    // 自动生成getter、setter
    public String getID() { return ID; }
    public void setID(String ID) { this.ID = ID; }
    public List<Book> getBooks() { return books; }
    public void setBooks(List<Book> books) { this.books = books; }
}

class Book {
    private String bookID;
    private String booktype;

    // 自动生成getter、setter
    public String getBookID() { return bookID; }
    public void setBookID(String bookID) { this.bookID = bookID; }
    public String getBooktype() { return booktype; }
    public void setBooktype(String booktype) { this.booktype = booktype; }
}

2. 解析JSON为Java对象

以Jackson为例(需引入Jackson依赖),将JSON字符串解析为Library实例:

import com.fasterxml.jackson.databind.ObjectMapper;

// 假设jsonString是输入的JSON内容
ObjectMapper objectMapper = new ObjectMapper();
Library library = objectMapper.readValue(jsonString, Library.class);

3. 使用Stream检测重复bookID

提供三种高效实现方式,可根据场景选择:

方式一:去重计数对比(简洁直观)

适合快速判断是否存在重复:

boolean hasDuplicate = library.getBooks().stream()
    .map(Book::getBookID)
    .distinct()
    .count() != library.getBooks().size();

原理:提取所有bookID去重后,若计数和原列表长度不一致,说明存在重复。

方式二:分组统计次数(可排查具体重复ID)

不仅能判断是否重复,还能获取重复ID的出现次数:

import java.util.stream.Collectors;

boolean hasDuplicate = library.getBooks().stream()
    .collect(Collectors.groupingBy(Book::getBookID, Collectors.counting()))
    .values()
    .stream()
    .anyMatch(count -> count > 1);

// 扩展:获取所有重复的bookID
List<String> duplicateIds = library.getBooks().stream()
    .collect(Collectors.groupingBy(Book::getBookID, Collectors.counting()))
    .entrySet()
    .stream()
    .filter(entry -> entry.getValue() > 1)
    .map(entry -> entry.getKey())
    .collect(Collectors.toList());

方式三:实时遍历检测(性能最优)

适合大数据量场景,找到重复后立即终止遍历:

import java.util.HashSet;
import java.util.Set;

Set<String> seenIds = new HashSet<>();
boolean hasDuplicate = library.getBooks().stream()
    .map(Book::getBookID)
    .anyMatch(id -> !seenIds.add(id));

原理:HashSet.add()方法在元素已存在时返回false,anyMatch遇到第一个false就会停止遍历,减少不必要的计算。


内容的提问来源于stack exchange,提问作者Sam Luis

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 07:17:35