Java如何处理多个返回值?
Posted
技术标签:
【中文标题】Java如何处理多个返回值?【英文标题】:Java How to handle multiple return Values? 【发布时间】: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 类中,然后在一个循环中完成。 【参考方案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<String, Integer>
可能存在一种情况,其中一个键可能与以前存储的值相同,并用新值有效地覆盖了前一个键。以上是关于Java如何处理多个返回值?的主要内容,如果未能解决你的问题,请参考以下文章