当前位置: 首页 > news >正文

Java集合工具:first和last

在平常开发过程中,我们经常会遇到截取列表片段的需求,比如取列表中前4个元素、取后四个元素。Java的List提供了subList方法,可以用来完成这些工作,但是使用起来并没有那么便利,比如取前四个元素:

list.subList(0, 4)

这里代码的本意是“取出列表中下标为0到4(不包括4)的元素”,结果恰好与需求相同,但是表达并非最直观。再来看取最后4个元素的版本:

int size = list.size();
list.subList(size - 4 ,size)

呃…更不直观了。我每次写这段程序都得小心翼翼检查index是否正确。

于是就有了本文要介绍的两个工具方法:firstlast

API介绍

  1. first
    方法签名:static <T> List<T> first(List<T> list, int n)
    功能:获取列表list中前n个元素,如果列表长度小于n,抛出异常。

  2. firstAtMost
    方法签名:static <T> List<T> firstAtMost(List<T> list, int n)
    功能:获取列表list中最多前n个元素,如果列表长度小于n,返回list的一个副本。

  3. last
    方法签名:static <T> List<T> last(List<T> list, int n)
    功能:获取列表list中最后n个元素,如果列表长度小于n,抛出异常。

  4. lastAtMost
    方法签名:static <T> List<T> lastAtMost(List<T> list, int n)
    功能:获取列表list中最多前n个元素,如果列表长度小于n,返回list的一个副本。

使用示例

List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7);List<Integer> first = first(list, 3);//{1, 2, 3}
List<Integer> atMostFirstList = firstAtMost(list, 3);//{1, 2, 3}
List<Integer> list1 = firstAtMost(list, 10);//{1, 2, 3, 4, 5, 6, 7}
List<Integer> last = last(list, 3);//{5, 6, 7}
List<Integer> lastAtMost = lastAtMost(list, 3);//{5, 6, 7}
List<Integer> last2 = lastAtMost(list, 30);//{1, 2, 3, 4, 5, 6, 7}

功能实现

    public static int size(@Nullable Collection<?> collection) {return collection == null ? 0 : collection.size();}public static <T> List<T> first(List<T> list, int n) {if (size(list) < n) {throw new IllegalArgumentException("list size less than " + n);} else {return new ArrayList<>(list.subList(0, n));}}public static <T> List<T> firstAtMost(List<T> list, int n) {int size = size(list);return size == 0? new ArrayList<>(): new ArrayList<>(size <= n ? list : list.subList(0, n));}public static <T> List<T> last(List<T> list, int n) {int size = size(list);if (size < n) {throw new IllegalArgumentException("list size less than " + n);} else {return new ArrayList<>(list.subList(size - n, size));}}public static <T> List<T> lastAtMost(List<T> list, int n) {int size = size(list);return size == 0? new ArrayList<>(): new ArrayList<>(size <= n ? list : list.subList(size - n, size));}

相关文章:

Java集合工具:first和last

在平常开发过程中&#xff0c;我们经常会遇到截取列表片段的需求&#xff0c;比如取列表中前4个元素、取后四个元素。Java的List提供了subList方法&#xff0c;可以用来完成这些工作&#xff0c;但是使用起来并没有那么便利&#xff0c;比如取前四个元素&#xff1a; list.sub…...

leetcode 905. 按奇偶排序数组

题目描述解题思路执行结果 leetcode 905. 按奇偶排序数组 题目描述 按奇偶排序数组 给你一个整数数组 nums&#xff0c;将 nums 中的的所有偶数元素移动到数组的前面&#xff0c;后跟所有奇数元素。 返回满足此条件的 任一数组 作为答案。 示例 1&#xff1a; 输入&#xff1a;…...

密码学安全性证明(一)Cramer-Shoup密码系统

Cramer-Shoup密码系统来自于A Practical Public Key CryptosystemProvably Secure against Adaptive ChosenCiphertext Attack这篇论文 CDH问题回顾&#xff1a; 已知(g,g^x, gk)能否计算gxk DDH问题回顾&#xff1a; 已知(g,g^x, g^k &#xff0c;D)能否判断D是否等于g^xk 注意…...

Asp.net Core系列学习(1)

Asp.net Core 6系列学习 文章目录 Asp.net Core 6系列学习Asp.net Core 概述一、在 ASP.NET 4.x 和 ASP.NET Core 之间进行选择二、适用于服务器应用的 .NET 与 .NET Framework三、ASP.NET Core Web UI1.服务器和客户端呈现 UI 的优势和成本2.服务器呈现的 UI 四、可用的 ASP.N…...

IDEA 2022.2 安装以及自定义优化

IDEA2022.2 安装以及自定义优化 文章目录 IDEA2022.2 安装以及自定义优化安装图解获取激活码自定义优化文件编码设置设置类文档注释和方式注释模板方法分割线 常用插件离线安装 安装图解 静默卸载&#xff08;旧版本的设置和配置将不会被删除&#xff09; 获取激活码 略…...

【华为OD机试真题2023B卷 JAVA】阿里巴巴找黄金宝箱(II)

华为OD2023(B卷)机试题库全覆盖,刷题指南点这里 阿里巴巴找黄金宝箱(II) 知识点数组哈希表优先级队列 时间限制:1s 空间限制:256MB 限定语言:不限 题目描述: 一贫如洗的樵夫阿里巴巴在去砍柴的路上,无意中发现了强盗集团的藏宝地,藏宝地有编号从0~N的箱子,每个箱子上…...

Python对Excel文件多表对多表之间的匹配(两种不同表头)——之json版

首先Excel文件多表对多表之间的匹配(VLOOKUP),有多种办法&#xff0c; 1&#xff1a;将Excel文件导入Mysql或其他数据库,然后将两种表合并成一张表&#xff0c;接着用数据库匹配 2&#xff1a;将两种表内容&#xff0c;复制粘贴到一起&#xff0c;各自分别保存成一张表&#xf…...

shiro环境搭建

源码部署 这种方法相对复杂&#xff0c;如果不需要分析源码直接用docker就行 前置条件&#xff1a;Maven Ideal Tomcat 下载方式1&#xff1a;https://codeload.github.com/apache/shiro/zip/shiro-root-1.2.4&#xff0c;然后将文件夹导入ideal下载方式2&#xff1a;将shiro…...

一文读懂selenium自动化测试(基于Python)

前言 我们今天来聊聊selenium自动化测试&#xff0c;我们都知道selenium是一款web自动化测试的工具&#xff0c;它应该如何去运用呢?我们接着看下去。 ​1、Selenium简介&#xff1a; 1.1 Selenium&#xff1a; Selenium是一款主要用于Web应用程序自动化测试的工具集合。Sele…...

如何高效地在网上找开源项目

开源项目是发展技能、分享想法和成为开发社区一员的好方法。开源意味着软件功能背后的源代码与所有想要阅读它的人公开共享。这意味着你可以准确地看到一个系统是如何工作的——一旦你愿意冒险&#xff0c;就为它做出贡献。除了向所有人开放贡献外&#xff0c;这种开放代码库通…...

2023系统分析师---冲刺资料必备知识点三

视图的优点&#xff1a; 视图能简化用户的操作&#xff1b;视图机制可以使用户以不同的方式查询同一数据&#xff1b;视图对数据库重构提供了一定程度的逻辑独立性&#xff1b;视图可以对机密的数据提供安全保护&#xff1b; ER图、实体、联系、联系的类型&#xff1a; 分布…...

集成Bean Validation 1.1(JSR-349)到 SpringMVC

Spring4新特性——集成Bean Validation 1.1(JSR-349)到 SpringMVC Bean Validation 1.1当前实现是Hibernate validator 5&#xff0c;且spring4才支持。接下来我们从以下几个方法 讲解Bean Validation 1.1&#xff0c;当然不一定是新特性&#xff1a; 1. 集成Bean Valida…...

【软考中级】软件设计师选择题题集(一)

海明校验码是在n个数据位之外增设k个校验位,从而形成一个k+n位的新的码字, 使新的码字的码距比较均匀地拉大。n与k的关系是(1)。 (1)A.2k - 1≥n + k  B.2n - 1≤ n + k   C.n = k  D.n-1≤k 【答案】A 【解析】 【答案】B A 【解析】 在采用结构化方法进行系统分析时,…...

10个炫酷特效的网页写法(附源码),拿去就能用,奈斯奈斯

这是我借鉴其他博主的&#xff0c;给网页加个背景&#xff0c;给鼠标加个特效&#xff0c;“使用简单”&#xff0c;“效果爆炸”的页面&#xff0c;分享给大家&#xff0c;如果觉得有帮助可以点赞收藏支持一下&#xff0c;如果能关注一下就再好不过了。 内容转载于https://bl…...

vscode开发stm32的编译环境配置教程

文章目录 1. 背景2. 配置步骤2.1. vscode插件安装2.2. 新建工程2.3. 配置编译环境2.3.1. 芯片支持2.3.2. 编译器选择2.3.3. CPU类型2.3.4. 硬件浮点选项2.3.5. 使用自定义的链接脚本2.3.6. RAM/FLASH布局2.3.7. 构建器选项2.4. 编译3. 问题汇总3.1. 浮点编译开关3.2. MicroLIB编…...

Live800在线客服系统:客户体验即是业绩来源

“客户就是上帝”&#xff0c;这一论断在商业行为中早已成为不争的事实。 所有企业都知道&#xff0c;满足客户的需求才能让企业稳步发展。在产品同质化严重的今天&#xff0c;客户服务成为核心竞争力&#xff0c;试想一下&#xff0c;在产品、价格相差无几的两个企业中&#…...

SAP工具箱 MR22自定义BAPI

点击蓝字 关注我们 一 前言 标准事务代码MR22 通过调整金额影响物料的成本价,前台界面中单个凭证中允许输入多行物料, 但是对应的BAPI函数仅支持输入单行物料 BAPI_MATVAL_DEBIT_CREDIT 正常库存BAPI_SALESORDSTCK_DEBIT_CREDIT 销售订单库存 这种情况 婶可忍叔不可忍 (感谢用户…...

ASP.NET 网上选课系统的设计与实现(源代码+论文)

随着教育改革的不断深化,建立一套能够适应这些改变的行政管理方案也就显得尤为重要。在高等院校的日常工作中,每个学期都要面临学生的选课工作。以往在选课工作的各个阶段都是手工操作,不但效率低下、工作繁琐,而且容易出错,于是开发一套适合校情的网上选课系统便成为了教…...

SpringMVC学习总结(路由映射、参数传递、转发和重定向...)

目录 1. MVC简介 2. SpringMVC简介 3. 路由映射注解 3.1 RequestMapping 3.2 GetMapping与PostMapping 4. 接收前端传递参数 4.1 接收单/多个参数 4.2 接收对象 4.3 接收JSON对象 4.4 后端参数重命名/映射 4.5 设置参数必传/非必传 4.6 获取URL中的参数 4.7 获取文…...

基于MAC地址的ACL配置

基于MAC地址的ACL配置 【实验目的】 掌握基于MAC地址的标准ACL的配置。验证配置。 【实验拓扑】 实验拓扑如图1所示。 图1 实验拓扑 设备参数如表所示。 表1 设备参数表 设备 接口 IP地址 子网掩码 默认网关 S1 e0/0 N/A N/A N/A e0/1 N/A N/A N/A PC1 N/…...

MCP插件下载403故障排查:OAuth 2026白名单机制详解

1. 问题现场还原&#xff1a;为什么MCP插件下载页面总卡在403 Forbidden&#xff1f;你点开MCP&#xff08;Model Control Platform&#xff09;官方插件市场&#xff0c;选中一个标注“支持v2.8”的调试工具&#xff0c;点击“下载ZIP”&#xff0c;浏览器控制台立刻弹出Faile…...

代码智能安全:对抗机器学习如何威胁与守护AI编程助手

1. 项目概述&#xff1a;代码智能时代的安全暗礁 作为一名在软件安全与AI交叉领域摸爬滚打了十多年的从业者&#xff0c;我亲眼见证了代码语言模型&#xff08;CLM&#xff09;从实验室的奇思妙想&#xff0c;迅速演变为GitHub Copilot、Amazon CodeWhisperer等生产力工具的核心…...

Java国密SM2证书Unknown curve异常的三步绕过方案

1. 这不是JDK的bug&#xff0c;是国密算法在Java生态里“没户口”的真实写照你刚把SM2证书集成进Spring Boot服务&#xff0c;调用验签接口时控制台突然炸出一行红字&#xff1a;java.security.InvalidKeyException: Unknown curve。接着堆栈里全是sun.security.ec.ECParameter…...

[SpringBoot 对象存储实战]:预签名 URL 直传 OSS 全流程设计与实现

&#x1f525;你好我是fengxin_rou这是我的个人主页fengxin_rou的主页 ❄️欢迎查看我的专栏我的专栏 《Java后端学习》、《JAVASE基础》、《JUC并发》、《redis》、《JVM虚拟机》、《MYSQL》、《黑马点评》、《rabbitmq》、《JavaWebAI的talis学习系统》、《苍穹外卖》 目录…...

为什么你的Gemini总生成错误JOIN?深度拆解语义理解断层、外键缺失与上下文截断三大黑洞

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;为什么你的Gemini总生成错误JOIN&#xff1f;深度拆解语义理解断层、外键缺失与上下文截断三大黑洞 当Gemini面对多表SQL生成任务时&#xff0c;频繁输出逻辑错误的JOIN语句——例如对无关联字段的表强…...

DeepSeek模型越狱攻击实录与反制(2024最新0day漏洞封堵手册)

更多请点击&#xff1a; https://kaifayun.com 第一章&#xff1a;DeepSeek模型安全加固概述 DeepSeek系列大语言模型在开源生态中广泛应用&#xff0c;但其默认部署配置存在若干潜在安全风险&#xff0c;包括未授权API访问、提示注入攻击面暴露、敏感信息泄露通道及权重文件未…...

2026校招人才整体素质洞察

导读&#xff1a;这份《2026 校招人才素质洞察报告》由前程无忧发布&#xff0c;围绕 AI 时代校招变局&#xff0c;依托 800 万 测评数据&#xff0c;系统剖析应届毕业生的素质特征&#xff0c;提出人才筛选新坐标&#xff0c;为企业校招提供战略方向与实操参考。关注公众号&a…...

交叉拟合与Neyman正交性:驯服机器学习因果推断中的偏差

1. 项目概述&#xff1a;当机器学习遇见因果推断&#xff0c;我们如何驯服“偏差”这头猛兽&#xff1f;在数据科学和经济学交叉的前沿地带&#xff0c;任何一个试图用机器学习模型做因果推断的研究者或工程师&#xff0c;都绕不开一个核心的噩梦&#xff1a;偏差&#xff08;B…...

为Hermes Agent自定义Provider并接入Taotoken服务

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 为Hermes Agent自定义Provider并接入Taotoken服务 Hermes Agent 是一个流行的智能体开发框架&#xff0c;它支持通过配置不同的模型…...

从被动应答到自我进化,深度拆解Agent核心技术范式的四年演进之路

从2023年大模型爆发至今&#xff0c;智能Agent技术只用了短短四年时间&#xff0c;就完成了数次颠覆性的迭代升级。从最初只会被动应答的聊天增强工具&#xff0c;到如今能够自主规划复杂任务、持续自我进化的数字员工&#xff0c;Agent的技术形态、架构逻辑和落地范式都发生了…...