我有一个方法需要2所列出的参数,你可以在方法体中我想要做一些过滤和将结果返回给调用者看到。我想这个代码转换为与lambda表达式在Java 8流,但我不明白这一点。我结束了这个创建多个流,并将其击败这个重构(恕我直言)的目的。我想知道的是,我该怎么做,以简单的方式,重构为只有一个流呢?
public Set<CustomerTrack> getCustomerTracks(List<CusomerTrack> tracks, List<Customer> customers) {
Set<CustomerTrack> tracksToSave = new HashSet<>();
for (Customer customer : customers) {
if (customer.getTrack() == null) {
continue;
}
Long allowedTrackId = customer.getTrack().getId();
for (CustomerTrack track : tracks) {
if (Long.valueOf(track.getId()).equals(allowedTrackId)) {
tracksToSave.add(track);
}
}
}
return tracksToSave;
}
看来,这是你所追求的:
customers.stream()
.filter(c -> c.getTrack() != null)
.map(c -> c.getTrack().getId())
.flatMap(id -> tracks.stream().filter(track -> Long.valueOf(track.getId()).equals(id)))
.collect(Collectors.toSet());
只是请注意,每个id
你迭代的整个列表tracks
; 这种具有O(n*m)
复杂性。这通常看到的那样糟糕,你可以改善它。
为了使它更好,你会首先创建一个HashSet
从IDS的Customer
; 具有HashSet
可以现在就contains
在它与你感兴趣的IDS,因为contains
拥有的时间复杂度O(1)
(这真的叫摊余的复杂性O(1)
)。所以,现在你的复杂度变O(n)
+ O(1)
,但由于O(1)
是一个常数,它真的O(n)
-要好得多,你收到了什么。在代码:
Set<Long> set = customers.stream()
.filter(c -> c.getTrack() != null)
.map(c -> c.getTrack().getId())
.collect(Collectors.toSet());
Set<CusomerTrack> tracksToSave = tracks.stream()
.filter(track -> set.contains(track.getId())
.collect(Collectors.toSet()));
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句