Java List 根据List中对象的属性值是否相同作为同一组,分割成多个连续的子List

需求:Java List 根据List中对象的属性值是否相同作为同一组,分割成多个连续的子List
package com.suncd.trs.provider.controller; import java.util.ArrayList; import java.util.List; import java.util.function.Function; public class ListGrouping { /** * 将List按照对象属性值是否相同进行分组,分割成多个连续的子List * @param list 原始List * @param keyExtractor 提取对象属性值的函数 * @param <T> List中对象的类型 * @param <K> 属性值的类型 * @return 分割后的子List集合 */ public static <T, K> List<List<T>> groupByProperty(List<T> list, Function<T, K> keyExtractor) { if (list == null || keyExtractor == null) { throw new IllegalArgumentException("List和keyExtractor不能为null"); } List<List<T>> result = new ArrayList<>(); if (list.isEmpty()) { return result; } List<T> currentGroup = new ArrayList<>(); K previousKey = null; for (T item : list) { K currentKey = keyExtractor.apply(item); // 如果是第一个元素,或者当前属性值与前一个不同,则开始新组 if (currentGroup.isEmpty() || !currentKey.equals(previousKey)) { if (!currentGroup.isEmpty()) { result.add(currentGroup); } currentGroup = new ArrayList<>(); } currentGroup.add(item); previousKey = currentKey; } // 添加最后一组 if (!currentGroup.isEmpty()) { result.add(currentGroup); } return result; } // 示例使用 public static void main(String[] args) { // 创建测试数据 List<Person> people = new ArrayList<>(); people.add(new Person("张三", 25)); people.add(new Person("李四", 25)); people.add(new Person("王五", 30)); people.add(new Person("赵六", 27)); people.add(new Person("钱七", 30)); people.add(new Person("孙八", 25)); people.add(new Person("周九", 35)); // 按年龄分组 List<List<Person>> groupedByAge = groupByProperty(people, Person::getAge); System.out.println("按年龄分组:"); for (int i = 0; i < groupedByAge.size(); i++) { System.out.println("组 " + (i + 1) + ": " + groupedByAge.get(i)); } } } class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return name + "(" + age + ")"; } } 

数据结构:

运行结果:

Read more

详解 JAVA 中的 @Schema 注解

详解 JAVA 中的 @Schema 注解

摘要 @Schema 注解是 Swagger(现更名为 OpenAPI)提供的一个重要注解,用于定义和描述 API 接口中的数据模型。通过 @Schema 注解,我们可以为类或字段添加描述信息,优化生成的 API 文档,方便开发者理解和使用接口。 本篇博客从小白角度出发,详细讲解 @Schema 的用法,包括注解的功能、适用场景、常见配置项和代码示例,帮助大家快速上手并掌握其核心知识点。 引言 在 RESTful API 开发中,文档是一个重要的环节。借助 Swagger,我们可以通过代码直接生成 API 文档。@Schema 注解就是其中的核心组件,用来描述 API 模型中的字段及其行为。 在本文中,你将学到: 1. 什么是 @Schema 注解? 2. 为什么需要使用

By Ne0inhk
让 AI 成为个人助理:JiuwenClaw 在日程规划中的应用实践

让 AI 成为个人助理:JiuwenClaw 在日程规划中的应用实践

让 AI 成为个人助理:JiuwenClaw 在日程规划中的应用实践 一、背景 在日常开发中,任务管理常常让人疲于应付。待办事项散落在飞书任务、本地 Todo 列表、会议纪要甚至同事的一句“回头处理一下”里。等到周会复盘时,才惊觉好几个关键事项早已被遗漏。问题不在于我们不做事,而在于信息太分散、优先级太模糊、时间安排又缺乏全局视角——结果就是忙而无效。 真正能提升效率的任务系统,得能自动聚合多源任务,用可量化的逻辑判断轻重缓急,并在排期冲突或截止临近时主动提醒。该文基于JiuwenClaw,从实际工程出发,拆解如何构建这样一个智能调度系统:包括统一采集架构、基于依赖与紧急度的排序引擎、飞书 OAuth 集成与 Token 自动刷新机制,以及通过心跳驱动的定时调度能力。 二、JiuwenClaw 相关介绍 2.1 JiuwenClaw 核心介绍 **JiuwenClaw是一款基于Python开发的智能AI Agent,**正如其名——“Claw” 象征着精准的抓取与连接。

By Ne0inhk
【JAVA探索之路】简单聊聊Kafka

【JAVA探索之路】简单聊聊Kafka

目录 一、Kafka核心概念与架构 核心概念解析 集群架构一览 二、Kafka核心特性与工作原理 顺序I/O与零拷贝 生产者可靠性保证 精确一次语义 三、Kafka关键API与生态系统 四、Kafka运维管理 五、Kafka典型应用场景 一、Kafka核心概念与架构 要掌握 Kafka,必须从理解其精心设计的基本模型开始。 核心概念解析 * 消息与批次:Kafka 的基本数据单元称为“记录”,包含键、值和时间戳。为提高效率,多条记录会组合成“批次”进行传输。 * 主题与分区:消息按“主题”进行分类,类似于数据库的表。每个主题可被分割为多个“分区”,这是 Kafka 实现并行处理和横向扩展的基石。消息在分区内按追加顺序存储,并分配一个单调递增的偏移量,从而保证了消息的顺序性。 * 生产与消费:生产者将消息发布到指定主题的特定分区;消费者则以“拉”

By Ne0inhk
【Coze-AI智能体开发】【一】初识Coze:零代码玩转 AI 智能体开发,新手也能轻松搭建专属 AI 应用!

【Coze-AI智能体开发】【一】初识Coze:零代码玩转 AI 智能体开发,新手也能轻松搭建专属 AI 应用!

目录 编辑 前言 一、Coze概述:为什么 Coze 值得我们深入学习? 1.1 揭开 Coze 的神秘面纱:它不是衣服上的扣子! 1.2 为什么要学习 Coze?三大核心优势直击痛点 (1)零代码 / 低代码门槛,人人都是 AI 开发者 (2)大模型加持,让 AI 应用更 "聪明" (3)全场景应用覆盖,商业价值与个性化需求双满足 1.3 学习完 Coze,你能收获什么?六大核心技能 get 1.4 学习 Coze 需要什么基础?门槛低到超乎想象 二、

By Ne0inhk