【问题标题】:ArrayList: cloning only of some items from itArrayList:仅从中克隆一些项目
【发布时间】:2012-10-17 12:15:42
【问题描述】:


我有一个 ArrayList 人员(姓名、姓氏、年龄)。现在我想克隆这个 ArrayList 的一个子集。假设我想从中创建一个年龄 > 30 岁的新 ArrayList。
设置一个从 Person 读取所有属性并将其添加到新的 ArrayList 的迭代并不太复杂。但是我只是想知道是否有更“优雅”并且可能更灵活的方式来实现这一点,也许实现我目前缺少的一些接口。只有一个要求:我想坚持使用基本的 Java JDK API,为此目的,合并一个外部库是一种矫枉过正的做法。
谢谢 最大

【问题讨论】:

  • 感谢所有 cmets,虽然我最终会使用循环,但我仍然学到了一些很酷的东西

标签: java


【解决方案1】:

我知道你说过你不想使用外部库,但如果你确实选择了,这个 sn-p 会有所帮助:

List<Person> persons = getSomePersons();
Collection<Person> greaterThan30 = Collections2.filter(persons, new Predicate<Person>() {
    public boolean apply(Person person) {
        return person.age > 30;
    }
});

它需要Guava Libraries。基本上,它是一个接收带有类型参数的 Predicate 类的函数。它有一个方法“apply”,可以返回你想要接受的条件。

这是人们抱怨使用 Java 的原因之一。没有适当的高阶函数支持。例如,在 Scala 中,您可以这样做:

val greaterThan30 = persons.filter(_.age > 30)

【讨论】:

    【解决方案2】:

    你想要的是一个filter,但是标准API库中没有一个实现,并且由于缺少闭包/lambdas,在几个第三方库中找到的实现,例如lambdaj all必须比其他语言更冗长。不过,这可能会在 Java 8 中改变。

    所以继续执行循环 - 这并不是说有什么脏东西,即使有更优雅的方式,它最终也会执行循环。

    【讨论】:

      【解决方案3】:

      这种操作应该是使用 LINQ。但是 LINQ 在 Java 中尚不可用。按照计划,它将使用 Java 8。

      不过在此之前,请尝试 LambdaJ http://code.google.com/p/lambdaj/

      【讨论】:

      • 你能提供一个关于 LINQ 进入 Java 8 的参考吗?
      • 我认为 LINQ 可能不仅仅是闭包。这是一个基于 SQL、XML 等的 DSL。
      • 同意 LINQ 不仅仅是闭包。但是我在上面的链接中指出的是一个应该解决问题的功能。它是 LINQ 的一部分。但是,是的,LINQ 不仅仅是闭包。
      【解决方案4】:

      Collections.binarySearch 可能会为您解决问题。

      您可以在这里找到一些例子。 Implement binary search in objects

      【讨论】:

      • 你应该解释一下你想如何使用二分搜索。
      • 他没有要求正确的代码。我只是展示了一种搜索方式。
      猜你喜欢
      • 2019-04-20
      • 2015-08-04
      • 2016-11-30
      • 2021-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-27
      • 1970-01-01
      相关资源
      最近更新 更多