【问题标题】:Conditionally add "optional items" with array initialization syntax?使用数组初始化语法有条件地添加“可选项目”?
【发布时间】:2012-12-23 04:29:19
【问题描述】:

我想知道我是否可以在这里轻松地使用 if 语句:

public Object[] tableItemFromVisit(Visit visit, boolean editable) {
    return new Object[] {
            visit.getIdVisit(),
            visit.getProfession().getProfessionName(),
            visit.getSpiProfessional().getFullName(),
            RegularFunctions.getTimeFormat().format(visit.getVisitDate()),
            RegularFunctions.toNormalCapitalizedText(visit.getVisitState()
                    .toString()), visit.getReason(), 
            if (editable) { "Edit" }, 
            };
}

这个结构怎么称呼?数组规范还是什么? 无论如何,如果变量“可编辑”为真,它必须有一个“编辑”字符串,如果它是假的,它不需要任何东西...... 显然我不想写两个太相似的返回语句......

【问题讨论】:

  • if 是一个语句,不能用作表达式。 ?: 是一个表达式:当然,所有表达式的计算结果都必须为 a 值。
  • 标题应该改进一下,但是不知道怎么改。
  • @MiserableVariable 是的,我知道,抱歉,我自己想不出一个好标题...

标签: java arrays if-statement syntax array-initialization


【解决方案1】:

将上述数组构造为ArrayList并返回其toArray?

这个想法的本质是做这样的事情。

ArrayList<Object> ret = new ArrayList<Object>(new Object[] {
            visit.getIdVisit(),
            visit.getProfession().getProfessionName(),
            visit.getSpiProfessional().getFullName(),
            RegularFunctions.getTimeFormat().format(visit.getVisitDate()),
            RegularFunctions.toNormalCapitalizedText(visit.getVisitState()
                    .toString()), visit.getReason()
            // don't add Edit item at all yet
            })

if(editable)
     ret.add("Edit");

return ret.toArray();

我不确定这种初始化是否有效,如果无效也可以使用Arrays.toList,或者只是一个一个添加。

【讨论】:

  • @MiserableVariable:我不同意。它清晰简单易读。除非有很好的理由不使用它(即性能在本节中至关重要),否则没有理由不使用它。
  • @MiserableVariable 在其他一些语言中,是的(如 Scala、C#、Ruby 等:D)。然而,Java 平庸的 Collection 语法/支持在这里展示了......当然,我会争辩为什么不只返回一个 List?
  • 各有各的 :) 我不觉得它漂亮,所以我写了没有好的选择。
  • 你能展示一下它的样子吗,因为我不知道你的意思是什么?我不确定是否可以返回一个列表,因为示例中使用了新的 Object[],所以我将它用于 Vaadin 框架中的表项
  • 看起来非常好,我现在正在尝试,但类型参数或其他东西似乎有问题: ArrayList ret = new ArrayList( 它说无法推断ArrayList 和 '' 运算符的类型参数不允许低于 1.7 的源级别(我的项目使用 1.6)
【解决方案2】:

使用提供的构造传递额外参数是不可能的。您可以通过以下方式之一修改您的代码:

试试ternary operator:

editable ? "Edit" : ""

editable ? "Edit" : null

if(editable)
{
    return new Object[] {
        visit.getIdVisit(),
        visit.getProfession().getProfessionName(),
        visit.getSpiProfessional().getFullName(),
        RegularFunctions.getTimeFormat().format(visit.getVisitDate()),
        RegularFunctions.toNormalCapitalizedText(visit.getVisitState()
                .toString()), visit.getReason(), 
        "Edit" }
}
else
{
return new Object[] {
        visit.getIdVisit(),
        visit.getProfession().getProfessionName(),
        visit.getSpiProfessional().getFullName(),
        RegularFunctions.getTimeFormat().format(visit.getVisitDate()),
        RegularFunctions.toNormalCapitalizedText(visit.getVisitState()
                .toString()), visit.getReason(), 
        }
}

【讨论】:

  • NO! 它没有相同的影响,它在数组中有一个额外的元素,其值为 ""null 如果条件不按住
  • 但是会创建一个额外的成员,它是一个空字符串,我不需要对象吗?还是我理解错了?
  • @ArturasM: 你想根据editable 状态添加额外的参数吗?如果是,则在此构造中是不可能的。
  • 反对票太容易了,这个问题有点模棱两可——没有什么可以被认为是空的就可以了
  • @Azodious 完全正确,如果它是假的,我什么都不想要。有什么我可以用来实现的结构吗?
【解决方案3】:

如果我理解你的话,如果editable 为真,你希望返回的Object[] 具有额外的元素。

这在 java 中是不可能的。

如果那里可以使用null,您可以使用editable ? "Edit" : null 代替if (editable) { "Edit" },但您可能已经知道了。

【讨论】:

  • 所以唯一的方法是写 if before 并写 return 语句在最后一个元素中存在或不存在?
【解决方案4】:

看起来你想像这样使用条件运算符:

editable ? "Edit" : ""(如果您希望这样,则为 null)。

显然,它有多余的元素。

【讨论】:

  • NO! 它没有相同的影响,它在数组中有一个额外的元素,值为""null 如果条件不持有
  • 不,如果条件为假,它更像是有一个元素或者根本没有元素
【解决方案5】:

假设您正在尝试创建一个对象来包含有关访问的数据。为什么不想为if (editable) { "Edit" } 创建一个函数并利用封装?

private String getEditFeedback(boolean editable){
  if(editable){
   return "Edit";
  } else {
   return //something
  }
}

然后在你的代码里面,

 public Object[] tableItemFromVisit(Visit visit, boolean editable) {
        return new Object[] {
                visit.getIdVisit(),
                visit.getProfession().getProfessionName(),
                visit.getSpiProfessional().getFullName(),
                RegularFunctions.getTimeFormat().format(visit.getVisitDate()),
                RegularFunctions.toNormalCapitalizedText(visit.getVisitState()
                        .toString()), visit.getReason(), 
               getEditFeedback(editable), 
                };
    }

【讨论】:

  • 非常类似于三元运算符的问题——如果条件不成立,它将在数组中多出一个元素。
猜你喜欢
  • 2021-01-28
  • 2011-08-06
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-18
  • 2016-03-03
相关资源
最近更新 更多