【问题标题】:Arrays.asList add ArrayList rather than specific membersArrays.asList 添加 ArrayList 而不是特定成员
【发布时间】:2019-11-12 19:47:09
【问题描述】:

我有一个包含一些包私有成员变量的对象,我将它们添加到另一个对象的 Google Sheets v4 ValueRange 中。当前的代码看起来有点像这样:

List<List<Object>> data = new ArrayList<>();
... 

/**
 * Sets all the values in the ValueRange member variable
 * @return the ValueRange object
 */
ValueRange requestBuilder() {
   ...

    //For each case, add it to the value range
    for (int i = 0; i < closedCases.size(); i++) {
        data.add(
                Arrays.asList(
                        closedCases.get(i).number,
                        closedCases.get(i).priority,
                        closedCases.get(i).firstResp,
                        closedCases.get(i).accName,
                        closedCases.get(i).subject,
                        closedCases.get(i).assigned,
                        closedCases.get(i).lastUpdated,
                        closedCases.get(i).daysOld,
                        closedCases.get(i).jiraCase
                )
        );
    }
    vr.setValues(data);
    return vr;
}

我要回答的问题是,有没有办法做 Arrays.asList(closeCases.get(i)) 或在案例对象上添加某种方法来简单地填充所有这些东西,而不是而不是调用 Arrays.asList() 中的每个成员变量。我也知道我可以使用 foreach,但仍需要使用相同的符号来添加项目,这是我试图避免的。

如果有人感兴趣,closedCases 只是一个对象的 ArrayList,其中包含一些字符串和双精度数。

【问题讨论】:

  • 还有其他方法可以做到这一点,但所有这些方法都需要在某处拥有这些属性的列表,因此没有更短的方法可以做到这一点。
  • 代码显然会受益于不重复九次,比如closedCases.get(i) 表达式。这就是局部变量的用途。或者,正如您自己所说,您可以使用 foreach。仅此一项就可以将代码减半。相反,Arrays.asList 不会将完全不相关的字段添加到列表中。什么样的逻辑应该决定哪些字段按什么顺序包含?

标签: java arrays arraylist


【解决方案1】:

您不知何故需要指定哪些字段以什么顺序进入此列表。如果要捕获所有字段,可以使用反射来迭代对象(可能选择声明的字段,而不是继承的字段,并且可能只选择包私有字段),如here 所述。

但这不是 Java 的惯用方式。

你能改变“包含一些包私有成员变量的对象”的定义,让它有一个带有键值对的 Map 吗?

【讨论】:

  • 不幸的是,由于 SF api 的疯狂,对象映射是相当静态的,尽管我经常被要求从这些报告中添加/删除内容,因此在对象上添加字段/删除它们和openCases / closedCases 对象相当频繁。我不知道如何在没有反射的情况下做到这一点,这不是我想要为可维护性做的事情。感谢您的回答。
  • @A_Elric 为此,您为什么不使用对象映射器将您的案例对象转换为地图,然后只使用 java8 流生成列表?
  • 请注意,Reflection 不保证反射成员的顺序。您仍然需要以某种方式枚举所需字段的名称。
【解决方案2】:

您可以在闭包保存的对象中添加一个 List 字段,并从循环内部调用该字段。

例如,假设对象是 Foo,

在 foo 内部,创建一个字段:

ArrayList<String> allFields = new ArrayList<String>{number. priority …… };

方法:

public ArrayList<String> getAll() {
    return allFields;
}

从循环内部,就这样做

data.add(closedCases.get(i).getAll());

如果字段不只是字符串,您可以创建不同的 arraylist 来保存不同类型的对象,这将再次增加列表,但可能比您给我们的要少得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 2021-11-11
    • 2021-08-23
    • 1970-01-01
    • 2013-05-20
    相关资源
    最近更新 更多