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&lt;String, Integer&gt; 可能存在一种情况,其中一个键可能与以前存储的值相同,并用新值有效地覆盖了前一个键。

以上是关于Java如何处理多个返回值?的主要内容,如果未能解决你的问题,请参考以下文章

怎么处理Java中的异常

如何处理返回布尔值的 GraphQL 查询?

服务器返回<null>值 iOS 端如何处理

如何处理以数组作为返回值的 go RPC 调用?

C#/JSON 如何处理从数据库查询返回的 NULL 值? [复制]

Postman 如何处理上一个接口返回值作为下一个接口入参?