繁体   English   中英

JAVA从条件中返回ArrayList对象

[英]JAVA return ArrayList object from conditional

我有一个实现另一个超类的接口测试类。 在测试类中,我有一个方法,它应该从数组列表返回一个对象; 首先它应该检查列表中的对象以查看它是否存在,如果不存在,它将返回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。 请帮我识别我的错误。

您的return语句返回Productnull ,对于getProduct都是合法的。 但是如果pritr.hasNext()返回false ,如果没有Product s怎么办? 如果while循环因此退出,则没有return语句。

while循环后添加一个return语句。

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

但这真的是你想要的吗? 如果找到的第一个产品不匹配,则返回null是没有意义的。 您可能需要考虑删除else块,继续通过列表搜索(而不是改变whileif )。

要处理错误,你需要在while循环结束时使用return语句,正如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;
}

您共享的代码存在逻辑错误。 您的意图是在找到匹配产品时返回匹配产品,否则返回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;
}

如果你感兴趣的话,在Java 8中,这可以用不同的方式完成,没有讨厌的“null”和更具说明性的风格。

因此,您希望从数组列表中返回具有指定标识的产品。 由于产品很可能不存在,您可以使ProductDB接口返回Optional Product 这样,界面的用户可以更清楚地了解预期的内容。

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

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();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM