当前位置: 首页 > 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));}
http://www.lryc.cn/news/70234.html

相关文章:

  • leetcode 905. 按奇偶排序数组
  • 密码学安全性证明(一)Cramer-Shoup密码系统
  • Asp.net Core系列学习(1)
  • IDEA 2022.2 安装以及自定义优化
  • 【华为OD机试真题2023B卷 JAVA】阿里巴巴找黄金宝箱(II)
  • Python对Excel文件多表对多表之间的匹配(两种不同表头)——之json版
  • shiro环境搭建
  • 一文读懂selenium自动化测试(基于Python)
  • 如何高效地在网上找开源项目
  • 2023系统分析师---冲刺资料必备知识点三
  • 集成Bean Validation 1.1(JSR-349)到 SpringMVC
  • 【软考中级】软件设计师选择题题集(一)
  • 10个炫酷特效的网页写法(附源码),拿去就能用,奈斯奈斯
  • vscode开发stm32的编译环境配置教程
  • Live800在线客服系统:客户体验即是业绩来源
  • SAP工具箱 MR22自定义BAPI
  • ASP.NET 网上选课系统的设计与实现(源代码+论文)
  • SpringMVC学习总结(路由映射、参数传递、转发和重定向...)
  • 基于MAC地址的ACL配置
  • 软件设计师 计算机网络
  • Gradle ——Gradle安装与配置
  • 网络安全这条路到底该怎么走?
  • 【C++】位图(海量数据处理)
  • 外包干了五年,废了...
  • 请问你如何理解以下的歌词“unravel - TK from 凛冽时雨 (TK from 凛として時雨)为什么很多人说崖山海战以后无中国
  • 从8连挂到面面offer,我只用了一个月,面试25K测试岗血泪经验分享给你
  • 计算机操作系统(慕课版)第二章课后题答案
  • 【离散数学】置换群和伯恩赛德定理编程题
  • 【自然语言处理】 - 作业2: seq2seq模型机器翻译
  • 随身WIFI折腾日记(四)---拓展USB接口读取U盘内容