Java Arrays.asList添加ArrayList而不是特定成员

Java Arrays.asList添加ArrayList而不是特定成员,java,arrays,arraylist,Java,Arrays,Arraylist,我有一个包含一些包私有成员变量的对象,我正在将它们添加到另一个对象中的GoogleSheetsV4值范围中。当前代码看起来有点像这样: List<List<Object>> data = new ArrayList<>(); ... /** * Sets all the values in the ValueRange member variable * @return the ValueRange object */ ValueRange requ

我有一个包含一些包私有成员变量的对象,我正在将它们添加到另一个对象中的GoogleSheetsV4值范围中。当前代码看起来有点像这样:

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;
}
List data=new ArrayList();
... 
/**
*设置ValueRange成员变量中的所有值
*@返回ValueRange对象
*/
ValueRange requestBuilder(){
...
//对于每种情况,将其添加到值范围
对于(int i=0;i
我想回答的问题是,有没有办法执行Arrays.asList(closeCases.get(I))或在case对象上添加某种方法来简单地填充所有内容,而不是调用Arrays.asList()中的每个成员变量。我也知道我可以使用foreach,但仍然需要使用相同的符号来添加项目,这正是我试图避免的

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

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

但在Java中,这不是惯用的方法

您能否更改“包含一些包私有成员变量的对象”的定义,使其具有一个带有键值对的映射?

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

但在Java中,这不是惯用的方法


您能否更改“包含一些包私有成员变量的对象”的定义,使其具有一个带有键值对的映射?

您可以在closedcases持有的对象中添加一个列表字段,并从循环内部调用该字段

例如,假设对象是Foo

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

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

如果字段不仅仅是字符串,您可以创建包含不同类型对象的不同arraylist,这将再次增加列表,但可能比您提供的要少。

您可以在closedcases所包含的对象中添加一个列表字段,并从循环内调用该字段

例如,假设对象是Foo

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

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

如果字段不仅仅是字符串,您可以创建包含不同类型对象的不同arraylist,这将再次增加列表,但可能比您提供的要少。

不幸的是,由于SF api的疯狂性,对象映射是相当静态的,虽然我经常被要求从这些报告中添加/删除内容,所以在对象和openCases/closedCases对象上添加/删除字段的情况相当频繁。我不知道有什么方法可以做到这一点而不进行反思,这不是我想为可维护性做的事情。谢谢你的回答。@A_èeric为此,为什么不使用对象映射器将case对象转换为映射,然后使用java8流生成一个列表呢?请注意,反射不能保证反射成员的顺序。您仍然需要以某种方式枚举所需字段的名称。不幸的是,由于SF api的疯狂性,对象映射是相当静态的,尽管我经常被要求从这些报告中添加/删除内容,因此在对象和openCases/closedCases对象上添加/删除字段是相当频繁的。我不知道有什么方法可以做到这一点而不进行反思,这不是我想为可维护性做的事情。谢谢你的回答。@A_èeric为此,为什么不使用对象映射器将case对象转换为映射,然后使用java8流生成一个列表呢?请注意,反射不能保证反射成员的顺序。您仍然需要以某种方式枚举所需字段的名称。有其他方法可以做到这一点,但所有这些方法都需要在某个地方有这些属性的列表,因此没有更短的方法可以做到这一点。代码显然会受益于不重复九次,比如closedCases.get(i)表达式。这就是局部变量的用途。或者,正如你自己所说,你可以使用foreach。仅此一项就可以将代码减半。相反,
Arrays.asList
不会向列表中添加完全不相关的字段。什么样的逻辑应该决定以何种顺序包含哪些字段?还有其他方法可以做到这一点,但所有这些方法都需要在某个地方有一个这些属性的列表,因此没有更简单的方法可以做到这一点。代码显然会受益于不重复九次,比如closedCases.get(i)表达式。这就是局部变量的用途。或者,正如你自己所说,你可以使用foreach。仅此一项就可以将代码减半。相反,
Arrays.asList
不会向列表中添加完全不相关的字段。什么样的逻辑应该决定以何种顺序包含哪些字段?
data.add(closedCases.get(i).getAll());