【问题标题】:Efficient way to work with List使用 List 的有效方法
【发布时间】:2017-06-21 07:52:05
【问题描述】:

请注意这是一个错误的问题。我问它是因为当我尝试使用 Iterator 时,我的 IntelliJ 一直在警告“Iterator”说 Iterator 不能有类型参数,这是不正确的。

不知何故,我的 IntelliJ 似乎显示了 java 1.4 的 javadoc。我仍在尝试修复它。谢谢。

^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ^^^^^

我在一个 java 程序中工作,其中一个 api 返回一个列表。

我的处理方式是:

ArrayList<SomeObject> arrayList = new ArrayList<>(apiThatReturnsAList);
for (SomeObject someObject : arrayList) {
    ...
}

我的代码审查员认为这可能是一种不太有效的处理方式,因为它会复制数据。他建议我使用迭代器。但我发现代码是这样的:

Iterator iterator = apiThatReturnsAList.iterator();
while (iterator.hasNext()) {
    SomeObject someObject = (SomeObject)iterator.next();
}

这里有丑陋的演员阵容,我们不想看到,因为它不安全。

那么,有没有一种有效的方法来处理这个 api 而不是复制数据?

谢谢!

【问题讨论】:

  • 你应该使用泛型。
  • 为什么你认为你需要复制List?你为什么要使用 原始类型 Iterator。你为什么要直接引用ArrayList。如果我是你的评论者,我会对这个烂摊子有很多意见。
  • 首先简单地迭代返回的列表有什么问题?
  • @SLaks 感谢您的建议。

标签: java arraylist collections iterator


【解决方案1】:

为避免复制,您可以将foreach 用于apiThatReturnsAList

for (SomeObject someObject : apiThatReturnsAList) {
    ...
}

事实上,foreachJLS 14.14.2. The enhanced for statement 引擎盖下的迭代器做同样的工作

【讨论】:

    【解决方案2】:

    只需使用预期的类参数化您的迭代器:

    Iterator<SomeObject> iterator = apiThatReturnsAList.iterator();
    

    当您调用next() 时,您将获得一个SomeObject 实例:

    Iterator<SomeObject> iterator = apiThatReturnsAList.iterator();
    while (iterator.hasNext()) {
        SomeObject someObject = iterator.next();
    }
    

    【讨论】:

    • 迭代器有类型参数?
    • @BoYuan 哦,加油。真的吗? RTFM.
    • 其实我在问这个问题之前就这么做了。我跟踪并在我的图书馆中没有看到这个。 IntelliJ 一直告诉我 Iterator 没有类型参数。
    【解决方案3】:

    使用for-each打印apiThatReturnsList中元素的内容:

    for (SomeObject element : apiThatReturnsList) {
        System.out.println(element);
    }
    

    无需将列表复制到另一个列表中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-07-02
      • 1970-01-01
      • 2012-05-27
      • 2013-06-06
      • 2011-10-11
      相关资源
      最近更新 更多