others - 在Java中,有没有一种更好的处理多个空?

我有以下代码


Set<Product> getallProducts(){



 Product p = getProduct(brand, price);


 Product p1 = getProduct(brand, price, location);


 Product p2 = getProduct(brand, price, qty);



 Set<SuperProducts> superProducts = new HashSet<>;



 if(p!=null){


 SuperProduct sp = getSuperProduct(p)


 superProducts.add(sp)


 }



 if(p1!=null){


 SuperProduct sp1 = getSuperProduct(p1)


 superProducts.add(sp)



 }



 if(p2!=null){


 SuperProduct sp2 = getSuperProduct(p2)


 superProducts.add(sp2)



 }


}



有什么办法可以处理p=null!我可以将p,p1,p2添加到列表中,并且按如下方式迭代它,但是,我正在寻找一个比把列表添加到列表里,然后再迭代它们更便宜的方法,另外,我想如果每次检查null是不是都比添加到列表,并且迭代它更昂贵?


List<Product> products = new ArrayList<>():


products.add(p);


products.add(p1);


products.add(p2);



and 


for(Product p:products){


// and adding to superProducts


}



时间:

你可以使用Stream.of,然后将filter作为:


return Stream.of(p1, p2, p3).filter(Objects::nonNull)


 .map(this::getSuperProduct)


 .collect(Collectors.toSet());



假设相同的代码序列重复3次,我将编写一个实用程序方法:


 private void addSuper(Product p, Set<SuperProduct> s) {


 if (p != null)


 s.add(getSuperProduct(p));


 }



然后


Set<SuperProduct> superProducts = new HashSet<>();


addSuper(getProduct(brand, price), superProducts);


addSuper(getProduct(brand, price, location), superProducts);


addSuper(getProduct(brand, price, qty), superProducts);



我对这种重构的主要关注点不是'测试non-null',而是原始语言的重复特性。

以下是使用可选的方法,不要比其他的答案更长,因为每个产品对象都需要创建。


Set<Product> getallProducts() {


 Set<SuperProducts> superProducts = new HashSet<>;



 Optional.ofNullable(getProduct(brand, price))


 .ifPresent(prod -> superProducts.add(new SuperProduct(prod)));


 Optional.ofNullable(getProduct(brand, price, location))


 .ifPresent(prod -> superProducts.add(new SuperProduct(prod)));


 Optional.ofNullable(getProduct(brand, price, qty))


 .ifPresent(prod -> superProducts.add(new SuperProduct(prod)));



 return superProducts;


}



...