如何将对象带出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循环的主要内容,如果未能解决你的问题,请参考以下文章

如何在嵌套的 for 循环中使用 continue 语句之类的东西?

python中for循环的用法

如何在 C++ 中使用 for 循环输出向量中的所有对象

将 for 循环合并到整数除法中

forin循环的变量如何变为全局

for循环和for in的区别