![](/img/trans.png)
[英]How to return (and remove) an object from an arraylist in java based on a condition of that object
[英]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
语句返回Product
或null
,对于getProduct
都是合法的。 但是如果pritr.hasNext()
返回false
,如果没有Product
s怎么办? 如果while
循环因此退出,则没有return
语句。
在while
循环后添加一个return
语句。
另外,因为你总是在while
循环的第一次迭代中返回一些东西,所以它不必是一个循环。 if
不更改其他内容,您可以将其更改为。
但这真的是你想要的吗? 如果找到的第一个产品不匹配,则返回null
是没有意义的。 您可能需要考虑删除else
块,继续通过列表搜索(而不是改变while
至if
)。
要处理错误,你需要在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.