【问题标题】:Java How to handle multiple return Values?Java如何处理多个返回值?
【发布时间】:2018-07-18 02:25:50
【问题描述】:

假设我有一个 Flight 对象列表

public class Flight {
    private int passengers;
    private int price
    ...

    //getters and Setters
}

List<Flight> flightList = new ArrayList<Flight>();

现在我需要累积每位乘客的价格和价格,因为我以后必须能够处理这两个信息。所以我会创建两种方法:

public int calculatePrice(List<Flight> flightList) {
    int price = 0;
    for (Flight flight : flightList) {
        price = price + flight.getPrice();
    }
    return price;
}

public int calculatePricePerPassengers(List<Flight> flightList) {
    int pricePerPassenger = 0;
    for (Flight flight : flightList) {
        pricePerPassenger = (pricePerPassenger) + (flight.getPrice() / flight.getPassgers());
    }
    return pricePerPassenger;
}

我有 4-5 种相同类型的方法。我不确定是否有太多冗余,因为我将 for 循环调用了 4-5 次,我可以轻松地在一个 for 循环中完成所有操作,但这会产生多个返回值的效果。那么这是合适的方式吗? (只是一个虚拟的例子)

【问题讨论】:

  • 对不起 - 但这不是重复,也不是要返回多个值。更多的是关于冗余和缓存,这可能是这里的解决方案。 OP 提到多个返回值只是作为他认为采取的方法的副作用。
  • 创建一个对象,其中包含您要返回的所有字段,并在循环中使用该对象并将其返回您以后需要的所有信息。
  • 您可以迭代一次并收集所有需要的信息
  • 一种解决方案是使用一个函数和一个循环,您可以在其中计算所需的所有可能值。作为返回值,您将只返回用户请求的值,以及您要保存的所有其余值,但如果数据正在更改,您必须更新此缓存数据,所以有一些标志“needsUpdate”,照着做。
  • 只需将需要计算的字段添加到 Flight 类中,然后在一个循环中完成。

标签: java oop arraylist methods


【解决方案1】:

这一切都取决于您想为用户提供哪些功能。因此,如果用户希望能够单独计算这两个价格,那么我看不到任何其他方式来解决您所拥有的。但是,如果您可以同时显示两种价格,那么您可以消除其中一种方法,并且只在您的航班列表中循环一次,并返回两种价格的组合。例如:

public static Pair[] calculatePrices(List<Flight> flightList)
{
     int pricePerFlight= 0;
     int pricePerPassenger = 0;
     for(Flight flight : flightList)
    {
       pricePerFlight = pricePerFlight + flight.getPrice();
       pricePerPassenger =   pricePerPassenger  +(flight.getPrice()/flight.getPassgers());

     }
    return new Pair[] {new Pair<>("pricePerFlight", pricePerFlight), new Pair<>("pricePerPassenger", pricePerPassenger )};
}

【讨论】:

    【解决方案2】:

    您可以将这两个值包装到一个新数组中:

    public int[] calculatePrices(List<Flight> flightList) {
    
        int totalPrice = 0;
        int pricePerCustomer = 0;
    
        for (Flight flight : flightList) {
            totalPrice += flight.getPrice();
            pricePerCustomer += (flight.getPrice() / flight.getPassgers());
        }
    
        return new int[] { totalPrice, pricePerCustomer };
    }
    

    【讨论】:

      【解决方案3】:

      你可以使用 map 或者你也可以扭曲你想在一个类中返回的所有字段。这里我以 Map 为例。

      public static Map<String, Integer> calculatePrice(List<Flight> flightList) {
          Map<String, Integer> priceMap = new HashMap<>();
          int price = 0;
          int pricePerPassenger = 0;
          for (Flight flight : flightList) {
              price = price + flight.getPrice();
              pricePerPassenger = (pricePerPassenger) + (flight.getPrice() / flight.getPassgers());
          }
          priceMap.put("price", price);
          priceMap.put("pricePerPassenger", pricePerPassenger);
          return priceMap;
      }
      

      编辑: 使用包装类 (DTO) 的示例。

          public static FligtPriceDTO calculatePrice(List<Flight> flightList) {
              FligtPriceDTO dto = new FligtPriceDTO();
              int price = 0;
              int pricePerPassenger = 0;
              for (Flight flight : flightList) {
                  price = price + flight.getPrice();
                  pricePerPassenger = (pricePerPassenger) + (flight.getPrice() / flight.getPassgers());
              }
              dto.setPrice(price);
              dto.setPricePerPassenger(pricePerPassenger);
              return dto;
          }
      }
      
      class FligtPriceDTO {
          private int price;
          private int pricePerPassenger;
      
          public int getPrice() {
              return price;
          }
      
          public void setPrice(int price) {
              this.price = price;
          }
      
          public int getPricePerPassenger() {
              return pricePerPassenger;
          }
      
          public void setPricePerPassenger(int pricePerPassenger) {
              this.pricePerPassenger = pricePerPassenger;
          }
      
      }
      

      【讨论】:

      • 虽然看似合理,但我建议使用更强类型的对象/DTO
      • 对,我已经编辑并添加了一个使用 DTO 的示例。谢谢!
      • 通常总是选择第二个选项,使用一个对象。因为Map&lt;String, Integer&gt; 可能存在一种情况,其中一个键可能与以前存储的值相同,并用新值有效地覆盖了前一个键。
      猜你喜欢
      • 2021-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-01
      • 1970-01-01
      相关资源
      最近更新 更多