直接访问Iterable对象

时间:2017-05-02 13:50:32

标签: java

我得到一个可迭代的列表,我使用以下代码

进行迭代
for (IssueField issueObj : issue.getFields())
{
    System.out.println(issueObj.getId());
}

该列表具有以下结构

[IssueField{id=customfield_13061, name=Dev Team Updates, type=null, value=null},
 IssueField{id=customfield_13060, name=Development, type=null, value={}}, 
 IssueField{id=customfield_11160, name=Rank, type=null, value=1|i0065r:}, 
 IssueField{id=customfield_13100, name=TM Product, type=null, value=IntelliGlance}, 
 IssueField{id=customfield_11560, name=Release Notes, type=null, value=null}, 
 IssueField{id=customfield_13500, name=Request Type, type=null, value=null}, 
 IssueField{id=customfield_13900, name=Category, type=null, value=null}, 
 IssueField{id=environment, name=Environment, type=null, value=null}]

列表中有超过100个这样的对象。有没有办法我可以直接获得所需的对象值而无需迭代所有值。目前正在使用我认为效率不高的东西。

for (IssueField issueObj : issue.getFields())
{
    if(issueObj.getId().equalIgnoreCase(someId)){
    //Object Found
         }
}

3 个答案:

答案 0 :(得分:4)

如果您希望能够像您所说的那样频繁搜索大型数据集,那么您应该使用HashMap,其中字符串是getId()中的值。搜索HashMap的大O时间复杂度是O(1),其中列表是O(n)。这将为您提供所需的效率。

答案 1 :(得分:1)

如果您使用的是Java 8,可以试试这个

<your-object> result1 = <your-list>.stream()                        
                .filter(x -> "jack".equals(x.getId()))        
                .findAny()                                      
                .orElse(null); 

首先它将转换列表转换为Streams,然后你想要id如“jack”,如果'findAny'则返回对象,否则返回null

答案 2 :(得分:0)

如果您不想迭代孔Collection来获取所需的对象,则需要将对象存储在最合适的集合中,因此如果您想通过其id获取元素,我认为最有效的方法是通过使用Hashmap,然后使用get函数来检索所需的元素。

HashMap实现为基本操作(get和put)提供了恒定时间性能,假设散列函数在桶之间正确地分散元素。对集合视图的迭代需要与HashMap实例的“容量”(桶的数量)加上其大小(键 - 值映射的数量)成比例的时间。因此,如果迭代性能很重要,则不要将初始容量设置得太高(或负载因子太低)非常重要。 Source