如何用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
相关产品推荐
相关产品推荐

