【问题标题】:Java List Object instead of an ArrayJava 列表对象而不是数组
【发布时间】:2016-09-07 11:52:21
【问题描述】:

我有一个这样的 Java 地图:

Map<String, Object> data = new HashMap<String, Object>();

我正在对其执行以下操作:

data.put("case_ids", new int[] { 31527 });

其中 case_ids 是第 3 方 API 的属性之一。但是,该 API 抛出 incorrect API request error 并建议我使用 List 对象而不是 Array:

data.put("case_ids", new int[] { 31527 });

不是List专家,有什么建议吗?喜欢data.put("case_ids", new List[] { 31527 });?

已编辑:扩展我当前的问题(以避免重新发布或类似问题)。如果我有大量用于上述 put 操作的值并想要创建一个已知值列表怎么办。我认为提及用逗号分隔的值列表(如 31527、31528、31529、31530、31531 等)不是正确的方法。我宁愿将其存储在某处,然后将其称为此处的输入-data.put("case_ids", new int[] { input });。另外,没有文件可以吗?只是想避免对文件的依赖。

【问题讨论】:

    标签: java arrays list file-handling listobject


    【解决方案1】:

    您可以使用以下格式

    data.put("case_ids", Arrays.asList(new Integer[] { 31527 }));

    如果你有一个整数数组,你提到了 cmets,那么你可以使用

    int [] cases = { 10,20,30};
    data.put("case_ids", Arrays.asList(cases));
    

    【讨论】:

    • 如果我想传递超过 1 个 int 值,如 31527,31528 ...我试图从常量 var 中读取:public static final int[] CASES = { 22445, 22466, 22467, 27765, 27772 }; 然后调用 data.put("case_ids", Arrays.asList(new Integer[] { CASES })) 似乎没有工作。请参阅我编辑的问题部分。
    • 应该是 Arrays.asList(CASES) 就是这样
    • 我不知道为什么它不起作用。你得到什么错误?您使用的是哪个 java 版本。
    • 我使用的不是 Java 8,而是 7。这是我得到的:无效或不完整的“API 请求中的 JSON 字符串”。
    • 这绝对不是 Java 错误。您可以在没有任何错误的情况下执行以下两行int [] cases = { 10,20,30}; Arrays.asList(cases) 吗?如果不查看整个代码,我们将无法解决问题。
    【解决方案2】:

    从已知值创建列表的最简单方法可能是

    Arrays.asList(31527)
    

    这会让你打电话

    data.put("case_ids", Arrays.asList(31527));
    

    假设 API 接受 List 作为值。如果没有 API 文档或错误消息,我们无法判断它真正接受的是什么。

    还有其他方法可以创建List,比如new ArrayList&lt;&gt;()等,看看javadoc和实现List接口的具体类即可。


    更新:如果您不想要外部文件,我想您可以在源代码中包含数字。最简单的选择是将它们作为静态字段放在某处

    public static final int[] VALUES = {1, 2, 3, /*...*/};
    

    您可以使用Arrays.stream(VALUES).boxed().collect(Collectors.toList())(参见here)将其转换为List(在Java 8 中)。

    我建议使用 Guava library 代替,您可以直接使用

    创建更安全的不可变列表
    public static final List<Integer> VALUES = ImmutableList.of(1, 2, 3) 
    

    如果您不喜欢在这样的代码中包含所有值,那么您可以从资源文件中读取它们,但这将是另一个问题。

    【讨论】:

    • 我刚刚编辑并扩展了我当前的问题(避免重新发布和类似的问题发布)。如何扩展以支持多个值作为列表的一部分?想象一下像 1000 个不同的值并直接在这里写它们不是正确的方法吗?而是一些文件/其他常量类?
    • 我已经扩展了我的答案。如果您更多地解释您的用例,例如,数字是什么,它们来自哪里等,您可能会得到更好的建议。
    • 如果我在源代码中给出值数组,例如 data.put("case_ids", Arrays.asList(31527, 31528, 31555));,API 不会抛出任何错误。但是,当我创建一个名为 Constants.java 的单独类并将此数组存储为 public static final int[] VALUES = {31527, 31528, 31555};然后调用 data.put("case_ids", Arrays.asList(VALUES));,我遇到了 Invalid JSON Api 异常的错误。有什么变化吗,我必须投射什么吗?
    • 我得到了您更新的答案:method stream(int[]) is undefined for the type Arrays? 此外,似乎没有找到Collectors - 说“无法解决收藏家”。我错过了什么吗?
    • 您可能没有使用 Java 8。有关如何将数组转换为列表的更多选项,请参阅提到的 question。大多数情况下,他们建议使用一些库,Guava 或 Apache。
    【解决方案3】:

    列表是一个接口。使用像data.put("case_ids", new ArraList&lt;Integer&gt;{ 31527 });这样的具体类

    【讨论】:

    • 不,这甚至不会编译。
    【解决方案4】:
    List<Integer> mList = new ArrayList<Integer>;
    mList.add(31527);
    data.put("case_ids", mList);
    

    【讨论】:

    • “任何让提问者朝着正确方向前进的答案都是有帮助的,但请尝试在答案中提及任何限制、假设或简化。可以接受简洁,但更全面解释更好。” - How do I write a good answer?
    • 感谢 Oussema,我刚刚编辑了我的问题并希望支持列表中的多个值。
    • 列表是一个集合,因此您可以在一个列表中存储任意数量的值,而无需关心大小。
    猜你喜欢
    • 2018-12-18
    • 1970-01-01
    • 2021-04-19
    • 1970-01-01
    • 1970-01-01
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多