java从集合中快速取某个元素

java从集合中快速取某个元素

对于元素的泛型为对象时,提供了五种方式从集合中取元素,每种方式都有各自的优缺点,都有各自的应用场景,可以依据自己的业务场景选择合适的方案,笔者更倾向于第四、第五种。

方式一:通过集合自带的工具类,get下标的方式获取。推荐指数:⭐⭐
优点:速度快
缺点:适用范围小(必须明确元素所属的下标,不然就取不到想要的元素)

方式二:普通遍历取值,通过for循环或增强for循环取值,取到对应的元素,break跳出循环。推荐指数:⭐⭐⭐
优点:取值准确,适用范围广
缺点:集合基数大的时候效率不高、消耗资源(从10w个集合元素中拿第9w个元素)

方式三:迭代器取值,通过迭代器取到相应的元素,break跳出循环。推荐指数:⭐⭐⭐
优缺点同方式二

方式四:通过stream流的filter方法筛选取值。推荐指数:⭐⭐⭐⭐⭐
优点:用法简单,取值准确,适用范围广
缺点:如果匹配不准确,可能会取不到值或异常(根据匹配规则取不到值或取到多个值)

方式五:集合转Map(key->主键,val->对象),从Map中通过key取value值。推荐指数:⭐⭐⭐⭐⭐
优点:取值准确,适用范围广,可复用性强(转map之后可以根据主键ID快速取任何一个元素)
缺点:集合数据量大的时候,转Map会比较耗时耗资源

接下来是代码的实现

场景:从Task的集合中,取主键ID为8的Task对象。示例代码如下↓

Task对象

@Data
@ToString
public class Task {
    private Integer taskId;
    private String taskUid;
    private String taskType;
    private String createTime;
}

代码实现

public class ListGetObjDemo {

    //模拟Task集合数据源(json字符串格式)
    private static final String BASE_DATA = "[" +
            "{'taskId':1,'taskUid':'fe7c0d4b-7000-4162-b973-79b1e2fbe32c','taskType':'9008','createTime':'2022-07-08 16:23:13'}," +
            "{'taskId':2,'taskUid':'1e17b929-f1cc-4c73-8fc8-be296d445d1d','taskType':'9008','createTime':'2022-07-08 16:23:12'}," +
            "{'taskId':3,'taskUid':'f51b4fbe-82b1-4e50-b879-10c7e1456d21','taskType':'9008','createTime':'2022-07-08 16:23:12'}," +
            "{'taskId':4,'taskUid':'5d71d61e-fa6f-41d2-8286-1ae2387ea480','taskType':'9008','createTime':'2022-07-08 16:23:14'}," +
            "{'taskId':5,'taskUid':'d5fc236f-8256-4e2b-8540-b22b1d9d4ad7','taskType':'9008','createTime':'2022-07-08 16:23:14'}," +
            "{'taskId':6,'taskUid':'e10053a8-6785-4da1-83ea-54ef2b325c90','taskType':'9008','createTime':'2022-07-08 16:23:14'}," +
            "{'taskId':7,'taskUid':'852142d8-c990-4fd7-af1b-826acfea912d','taskType':'9009','createTime':'2022-07-08 16:23:13'}," +
            "{'taskId':8,'taskUid':'243a70f6-a77e-4a4a-9727-7674605a786f','taskType':'9008','createTime':'2022-07-08 16:23:14'}," +
            "{'taskId':9,'taskUid':'c33356d9-0362-4af7-9030-4037d631a036','taskType':'9010','createTime':'2022-07-08 16:23:13'}," +
            "{'taskId':10,'taskUid':'5ea3a5ac-89ee-4a04-af11-4bf29524396e','taskType':'9008','createTime':'2022-07-08 16:23:14'}" +
            "]";

    /**
     * main方法入口
     */
    public static void main(String[] args) {
        //用fastjson把json字符串转为集合
        List<Task> tasks = JSON.parseArray(BASE_DATA, Task.class);
        //分别调用五个方法,得到taskId为8的对象信息
        method1(tasks);
        method2(tasks);
        method3(tasks);
        method4(tasks);
        method5(tasks);
    }

    /**
     * 方式一:集合下标取值
     */
    public static void method1(List<Task> list){
        Task task = list.get(7);
        System.out.println("方式一结果:"+task);
    }

    /**
     * 方式二:普通遍历取值
     */
    public static void method2(List<Task> list){
        Task task = null;
        for (Task t : list) {
            if (t.getTaskId() == 8) {
                task = t;
                break;
            }
        }
        System.out.println("方式二结果:"+task);
    }

    /**
     * 方式三:迭代器取值
     */
    public static void method3(List<Task> list){
        Task task = null;
        Iterator<Task> iterator = list.iterator();
        while (iterator.hasNext()) {
            Task next = iterator.next();
            if (next.getTaskId() == 8) {
                task = next;
                break;
            }
        }
        System.out.println("方式三结果:"+task);
    }

    /**
     * 方式四:stream流filter筛选取值
     */
    public static void method4(List<Task> list){
        Task task = list.stream().filter(i -> i.getTaskId() == 8).findFirst().get();
        System.out.println("方式四结果:"+task);
    }

    /**
     * 方式五:集合转Map,从Map中通过key取value值
     */
    public static void method5(List<Task> list){
        Map<Integer, Task> taskMap = list.stream().collect(Collectors.toMap(key -> key.getTaskId(), val -> val));
        Task task = taskMap.get(8);
        System.out.println("方式五结果:"+task);
    }
}

运行结果

在这里插入图片描述

  • 8
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值