【发布时间】:2018-01-22 20:43:48
【问题描述】:
我有这样的代码:
List<Listing> Listings = new ArrayList<>();
Listings.add(listing1);
Listings.add(listing2);
...
...
...
Listing listing= listings.stream()
.filter(l -> l.getVin() == 456)
.findFirst();
我的问题是过滤过程的时间复杂度是多少?如果是 O(n),我的直觉是把它转换成类似 HashSet 的数据结构,这样时间复杂度就可以变成 O(1),有没有一种优雅的方法可以用流做到这一点?
【问题讨论】:
-
它可能是一个并行流,但复杂度仍然是 O(n)。将它转换为一个过滤器操作的集合仍然是 O(n) 所以你首先需要使用一个集合。您可能希望使用 LinkedHashset 来保持插入顺序或 TreeSet 用于其他排序(列表意味着某些排序和/或允许重复)。
-
Stream#filter始终遍历完整的Stream并将过滤条件应用于每个元素。一个优点是流可以很容易地并行化,但这只会将时间复杂度降低一个常数因子(物理内核的数量)。
标签: java performance java-8 java-stream