JAVA从条件中返回ArrayList对象

时间:2015-08-21 18:08:16

标签: java arraylist iterator

我有一个实现另一个超类的接口测试类。在测试类中,我有一个方法,它应该从数组列表返回一个对象;首先它应该检查列表中的对象以查看它是否存在,如果不存在,它将返回null,否则它将返回找到的对象。这是我实施的代码:

public class ProductDBImpl implements ProductDB {

// field declarations
ArrayList<Product> products = new ArrayList<Product>();



@Override
public Product getProduct(int productId)
{
    // TODO Auto-generated method stub
    // create an iterator for the Arraylist
    Iterator<Product> pritr = products.iterator();
    while(pritr.hasNext())
    {
        Product pr = pritr.next();
        if (pritr.next().getId() == productId)
        {
            return pr;
        }
        else
        {

            return null;
        }
    }

}

不幸的是我收到的错误是: 此方法必须返回Product类型的结果。

我的印象是,通过使用迭代器并循环遍历列表中的每个元素,每个元素都是一个类型Product。请帮我识别我的错误。

4 个答案:

答案 0 :(得分:5)

您的return语句返回Productnull,两者都是getProduct合法的。但是,如果pritr.hasNext()没有falseProduct会立即返回return怎么办?如果while循环因此退出,则没有return语句。

while循环后添加while语句。

另外,因为你总是在if循环的第一次迭代中返回一些东西,所以它不必是一个循环。您可以将其更改为null而无需更改任何其他内容。

但这真的是你想要的吗?如果找到的第一个产品不匹配,则返回else没有意义。您可以考虑删除while阻止,继续搜索列表(而不是将if更改为{{ pages[training_missions].application_name.mobile }} )。

答案 1 :(得分:4)

要处理错误,您需要在return循环结束时使用while语句,正如rgettman指出的那样。但是你也不应该在循环中返回null。您应该只在循环完成后返回null,并且未找到匹配的产品,如下所示:

@Override
public Product getProduct(int productId)
{
    Iterator<Product> pritr = products.iterator();
    while (pritr.hasNext())
    {
        Product pr = pritr.next();
        if (pritr.next().getId() == productId)
        {
            return pr;
        }
    }
    return null;
}

答案 2 :(得分:2)

您共享的代码存在逻辑错误。您的意图是在找到匹配产品时返回匹配产品,否则返回null。如果你找到了你的产品,它会更好地添加一个休息时间。正确的代码是......

public class ProductDBImpl implements ProductDB {

// field declarations
ArrayList<Product> products = new ArrayList<Product>();



@Override
public Product getProduct(int productId)
{
    // TODO Auto-generated method stub
    // create an iterator for the Arraylist
    Iterator<Product> pritr = products.iterator();
    Product productObj = null;
    while(pritr.hasNext())
    {
        Product pr = pritr.next();
        if (pritr.next().getId() == productId)
        {
            productObj = pr;
            break;
        }
    }
    return productObj;
}

答案 3 :(得分:0)

如果你有兴趣,在Java 8中,这可以用不同的方式完成,没有讨厌的&#34; null&#34; s和更具说明性的风格。

因此,您希望从数组列表中返回具有指定标识的产品。 由于产品很可能不存在,因此可以使ProductDB接口返回Product public class ProductDBImpl implements ProductDB{ ArrayList<Product> products = new ArrayList<>(); @Override public Optional<Product> getProduct(int productId) { return products.stream() .filter(p -> p.getId() == productId) .findFirst(); } } 。这样,界面的用户可以更清楚地了解预期的内容。

在get product函数中,只需从产品列表中获取Optional,过滤具有所需productId的元素并返回第一个元素。

popIn.delegate = self;
[annotation.layer addAnimation:popIn forKey:@"popIn"];
相关问题