【问题标题】:Return an element within a for-each outside it in Java在Java中返回一个for-each中的元素
【发布时间】:2017-01-23 20:51:13
【问题描述】:

我想返回 List 的一个元素,我在循环外使用 for-each 循环遍历该元素。

这是我的方法:

private List<Taxi> taxis = new ArrayList<Taxi>();
Taxi scheduleTaxi(){
     for (Taxi taxi : taxis){
         if (taxi.isFree()) {
            return taxi;
        }
     }
    return null; //I would like it to return taxi not null
}

有什么建议吗?谢谢

【问题讨论】:

  • 你的问题没有意义。你的代码已经做了你想要的。您已经返回循环内的第一辆免费出租车,如果没有免费出租车,则返回 null。
  • 嗯,你有一个完整的Taxi列表,你想返回哪一个?
  • 我做了一个测试,它总是返回 null 它不返回免费出租车
  • 这意味着没有免费的出租车。同样,在这种情况下,应该退回哪辆出租车?
  • @Takichiiii 当然很好。您的列表为空,方法直接转到return null;

标签: java for-loop foreach return


【解决方案1】:

如果我正确理解了这个问题,那么您不是在问如何从迭代循环内部返回,而是在尝试避免在找不到合适的匹配项时返回 null,对吗...?我想这是有道理的;我有一些同事出于某种原因反对使用 null。

您可以采用的一种方法是“哨兵价值”方法,正如我的一位导师曾经所说的那样(可能有更好的名称)。基本上,您有一个特定的Taxi 实例,它表示完全没有出租车。在你的出租车课上……

public class Taxi {
    public static final Taxi NO_TAXI = new Taxi(/*constructor params here*/);

    // Insert the rest of your class here!
}

基本上,您希望初始化一个可全局访问的常量 Taxi 实例,该实例表示不是 Taxi 的概念。您班级的用户可以查看该实例并知道“哦,这意味着没有出租车。”

所以,你原来的 scheduleTaxi 方法看起来像这样:

private List<Taxi> taxis = new ArrayList<Taxi>();
Taxi scheduleTaxi(){
    for (Taxi taxi : taxis){
        if (taxi.isFree()) {
            return taxi;
        }
    }
    // No free taxi found! Return the no-taxi instance.
    return Taxi.NO_TAXI;
}

确保您包含如果没有找到免费出租车,该方法将返回 NO_TAXI,这样您的用户就不会感到困惑!

我个人更喜欢只使用null。 :)

【讨论】:

    【解决方案2】:

    您所写的内容完全正确(您可能会得到 null,因为我猜没有任何免费的),但这里有另一种简单的方法来帮助您理解这个概念。

    TaxiisFree() 分配给一个引用,并像这样在for循环之外返回它,

    private List<Taxi> taxis = new ArrayList<Taxi>();
    Taxi freeTaxi = null;
    Taxi scheduleTaxi(){
         for (Taxi taxi : taxis){
             if (taxi.isFree()) {
                freeTaxi = taxi;
                break; //since you already found what you want, no need to keep going.
            }
         }
        return freeTaxi;
    }
    

    【讨论】:

    • 非常感谢!!你知道为什么在我的代码中它并不总是return null,即使它是最后一次返回?哪个代码质量最好?
    • 一个函数只能返回一次,即“返回出租车;”执行它已经超出了功能,它会跳过它之后的每一行。但是,如果这没有发生,它将一直运行到函数结束或遇到下一个 return 语句。
    • 谢谢!所以我猜你的 sn-p 更好,因为它只包含一个 return
    • 我不会说更好。这只是从函数返回值的另一种方式。您可以在函数中有多个 return 语句,也可以有一个 return 语句,但您会根据您的条件不断为该引用分配不同的值。我个人更喜欢方法二:)
    • IMO 方法的原始实现比这个方法提供的要好一点:它更简洁,更容易阅读。出于同样的原因,这个仍然可以返回null
    【解决方案3】:

    看起来没问题,如果问题与“我应该返回空引用吗??”有关,那么没问题。

    如果你稍微改变方法的名称并添加一个好的java doc,比如>

    public Taxi getAvaliableTaxi(){
         for (Taxi taxi : taxis){
             if (taxi.isFree()) {
                return taxi;
            }
         }
        return null; //I would like it to return taxi not null
    }
    

    然后我可以看到,在我调用该方法时,可能没有出租车可用或免费。所以 null 绝对是一个有效的返回类型 作为 API 的客户,我是否有责任在我跳上空出租车之前检查回报...

    【讨论】:

      猜你喜欢
      • 2011-01-29
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-24
      • 2014-07-21
      • 2016-09-26
      • 1970-01-01
      相关资源
      最近更新 更多