【问题标题】:Using Java 8 functions instead of multiple if elses使用 Java 8 函数而不是多个 if else
【发布时间】:2019-05-09 23:02:06
【问题描述】:

我有下面的代码,getBrand 和 calculateSum 是一些返回值的函数。我想使用 java 8 函数压缩这段代码。如果可能的话,我想摆脱多个如果。是否可以使用 Java 8 函数?

import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

public class Q56068628 {

    static class Brand {
        public Set<Location> locations() { return Collections.emptySet(); }
    }
    static class Location {}
    static class Product {}

    int getSum(int price, Product p){
        int sum = 0;
        if(price > 0){
           Brand b = getBrand(p); // getBrand takes type Product as argument
           if( b !=null){
              Set<Location> s = new HashSet<>();
              s.addAll(b.locations());
              for(Location l : s){
                sum = calculateSum(l, sum); /* calculateSum function takes location
                            argument and calculates sum. Sum value is replaced for
                          each for loop call */
              }
           }
        }
       return sum;
    }

    private Brand getBrand(Product p ){
    //// some code returns brand
        return null;
    }

     private int calculateSum(Location l, int sum ){
        //// some code returns an integer
        return 0;
     }

}

【问题讨论】:

  • 如果您只需要使用最后一个位置的sum,为什么要遍历整个集合?以及为什么将sum 传递给calculateSum,当它在每个循环中被替换时。

标签: java java-8


【解决方案1】:

可能是这样,但if 语句通常比方法调用便宜,而且对于不了解这些 API 的人来说更容易阅读。您可以考虑的一项改进是:

private Optional<Brand> getBrand(Product p ){
   //...
   //something...
   if (condition) { return Optional.ofNullable(new Brand(p)); }
   else { return Optional.empty(); }
}

然后:

Optional<Brand> brand = getBrand(p);
if (brand.isPresent()) {
  Brand b = brand.get();
}

null 处理更安全。

【讨论】:

  • 这留下了比以前更多的ifs。为什么不使用ifPresentConsumer 而不是isPresent 周围的if 语句?
猜你喜欢
  • 2018-09-26
  • 1970-01-01
  • 2011-10-02
  • 2020-10-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多