Java 如何使对象脱离for循环

Java 如何使对象脱离for循环,java,object,for-loop,return,Java,Object,For Loop,Return,我有以下方法,如果对象的name属性与输入字符串匹配,则该方法应返回product对象 public Product find(String nameInput){ for(Product product : this.Products){ if(product.getName().equalsIgnoreCase(nameInput)){ return product;

我有以下方法,如果对象的name属性与输入字符串匹配,则该方法应返回product对象

public Product find(String nameInput){  
 for(Product product : this.Products){           
        if(product.getName().equalsIgnoreCase(nameInput)){
            return product;                        
        }     
   }
}
这给了我以下错误:

我知道我可以在方法的末尾返回null,但是有没有更优雅的方法呢?

您可以使用并返回
可选的
,首先匹配
产品
或空的
可选的

this.Products.stream()
             .filter(p->p.getName().equalsIgnoreCase(nameInput))
             .findFirst();
您还可以使用
可选
上的方法返回默认值

您可以执行以下操作:

public Optional<Product> find(String nameInput){  
 for(Product product : this.Products){           
        if(product.getName().equalsIgnoreCase(nameInput)){
            return Optional.of(product)                        
        }     
   }
    return Optional.empty();
}

由于Java 8,您可以返回可选的而不是产品:

public Optional<Product> find(String nameInput){  
  for(Product product : this.Products){           
    if(product.getName().equalsIgnoreCase(nameInput)){
        return Optional.of(product);                        
    }     
  }
  return Optional.empty();
}
public可选查找(字符串名称输入){
对于(产品:this.Products){
if(product.getName().equalsIgnoreCase(nameInput)){
(产品)退货可选;
}     
}
返回可选的.empty();
}
此外,正如其他几张海报也提到的,我将使用流api而不是for each循环

按以下步骤操作:

public Product find(String nameInput){  
    Product p = null;
    for(Product product : this.Products){           
        if(product.getName().equalsIgnoreCase(nameInput)){
            p = product;
            break;                        
        }     
    }
    return p;
}

有一些流将循环设为一行,但您仍然需要决定是返回null还是引发异常。它如何返回产品对象?请参阅此文档
findFirst
是短路终端操作,并返回
可选
@InitialisingAttributes
public Product find(String nameInput){  
    Product p = null;
    for(Product product : this.Products){           
        if(product.getName().equalsIgnoreCase(nameInput)){
            p = product;
            break;                        
        }     
    }
    return p;
}