使用数组初始化语法有条件地添加“可选项目”?

Posted

技术标签:

【中文标题】使用数组初始化语法有条件地添加“可选项目”?【英文标题】: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 是的,我知道,抱歉,我自己想不出一个好标题... 【参考方案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), 
                ;
    

【讨论】:

非常类似于三元运算符的问题——如果条件不成立,它将在数组中多出一个元素。

以上是关于使用数组初始化语法有条件地添加“可选项目”?的主要内容,如果未能解决你的问题,请参考以下文章

如何向 Swift 数组添加扩展以有条件地追加?

如何使用 Vue.js 和 Tailwind 基于数组中的元素有条件地将多个类添加到 <span>?

C语言初阶最详细的数组知识总结,超多干货!!(带三大应用实例)

go语言基础语法-容器数据类型-数组

go语言基础语法-容器数据类型-数组

以反应形式有条件地添加指令