使用数组初始化语法有条件地添加“可选项目”?
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【参考方案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),
;
【讨论】:
非常类似于三元运算符的问题——如果条件不成立,它将在数组中多出一个元素。以上是关于使用数组初始化语法有条件地添加“可选项目”?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Vue.js 和 Tailwind 基于数组中的元素有条件地将多个类添加到 <span>?