将可迭代对象转换为实体列表的有效方法

问题描述 投票:0回答:1

什么是将可迭代对象转换为实体列表的有效方法? 在下面的代码中。收集到列表的最后一行 - 大数据集(约 400k)需要 ~70 秒

//mongoDB: reading from collection
Iterable<SomeEntity> records = someSummaryCollection.find(and(
                geoWithin("geoLocation", BasicDBObject.parse(area)),
                lte(START_DATE, endDate),
                gte(END_DATE, startDate),
                ne(NAME, "testing"),
                nin(CATEGORIES, "random")
        )).maxTime(someDuration, TimeUnit.MINUTES);

//converting to list
List<SomeEntity> someSummary = StreamSupport.stream(records.spliterator(), true).collect(Collectors.toList());

注意:我们有一个有效的用例,我们需要获取这些数据量,然后执行一些业务逻辑并将其显示在 UI 中

java list stream iterable collectors
1个回答
1
投票

什么是将可迭代对象转换为实体列表的有效方法?在下面的代码中。收集到列表的最后一行 - 大数据集(约 400k)需要 ~70 秒

最有效的方法可能就是不这样做。直接使用

Iterable
及其迭代器,而不是转换为
List
.

如果这还不够,并且如果您有一种方法来获取元素的数量而无需全部迭代,并且如果只读

SequentialList
适合您的目的,那么创建一个适合您的迭代器的
ListIterator
包装器,并使用它和
AbstractSequentialList
创建一个定制的
List
包装器,它可以非常快速地实例化。 但是,我预计完全迭代此类列表的实例所花费的时间与基于流的方法收集所有项目所花费的时间一样多。

但是如果您需要一个可修改的列表或一个具有高效随机访问功能的列表,那么您将需要迭代所有项目一次来构建它,就像您的流方法一样。这很可能花费了大部分时间。但是你可以通过这样的方式来测试它:

List<SomeEntity> someSummary = new ArrayList<>();  // or perhaps LinkedList
for (SomeEntity entity : records) {
    someSummary.add(entity);
}

如果您计划多次迭代元素,或者如果原始数据的持久性有限(例如数据库

ResultSet
可能具有),这也是可取的。

无论如何,我认为您的潜在性能问题很可能是迭代原始可迭代对象的所有元素的成本很高。你也许可以让它变得更好一点,或者至少不那么引人注目,但如果你在任何情况下都需要对所有元素至少迭代一次,那么无论你做什么,你都不太可能得到显着的改进。

© www.soinside.com 2019 - 2024. All rights reserved.