如何将对象带出for循环
Posted
技术标签:
【中文标题】如何将对象带出for循环【英文标题】:How to bring object out of a for loop 【发布时间】:2020-05-31 21:00:39 【问题描述】:如果其名称属性与输入字符串匹配,我有以下方法应该返回一个 product 对象。
public Product find(String nameInput)
for(Product product : this.Products)
if(product.getName().equalsIgnoreCase(nameInput))
return product;
它给了我以下错误:
我知道我可以在方法结束时返回 null,但是有没有更优雅的方法来做到这一点?
【问题讨论】:
有流使循环变成一行,但你仍然需要决定是返回null还是抛出异常。 【参考方案1】:您可以使用stream 和findFirst 返回Optional
与第一个匹配Product
或空Optional
this.Products.stream()
.filter(p->p.getName().equalsIgnoreCase(nameInput))
.findFirst();
您也可以在Optional
上使用orElse 方法返回默认值
【讨论】:
它如何返回一个产品对象? 看这个文档baeldung.com/java-8-streams#referencingfindFirst
是短路终端操作并返回Optional
@InitialisingAttributes【参考方案2】:
你可以这样做:
public Optional<Product> find(String nameInput)
for(Product product : this.Products)
if(product.getName().equalsIgnoreCase(nameInput))
return Optional.of(product)
return Optional.empty();
或者,更好的是,将 ForEach 循环替换为 Stream。
然后你可以使用 ifPresent
find("***").ifPresent(consumer)
【讨论】:
【参考方案3】:按如下方式进行:
public Product find(String nameInput)
Product p = null;
for(Product product : this.Products)
if(product.getName().equalsIgnoreCase(nameInput))
p = product;
break;
return p;
【讨论】:
【参考方案4】:从 Java 8 开始,您可以返回 Optional 而不是 Product:
public Optional<Product> find(String nameInput)
for(Product product : this.Products)
if(product.getName().equalsIgnoreCase(nameInput))
return Optional.of(product);
return Optional.empty();
此外,正如其他几位海报也提到的那样,我将使用流 api 而不是 for each 循环。
【讨论】:
以上是关于如何将对象带出for循环的主要内容,如果未能解决你的问题,请参考以下文章