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);
}
}
运行结果