我有一个方法,需要传入两个列表作为参数,可以看到在方法中我想要过滤一些内容并将结果返回给调用者。我想将这段代码转换为使用Java 8的流式API和lambda表达式,但是我无法理解如何实现。我最终创建了多个流来完成这个功能,这违背了重构的初衷(我的意见)。我想知道的是,如何以简单的方式将这段代码重构为只使用一个流?
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
中的id列表;对于 每个 id,你都要遍历tracks
列表以找到需要的内容。遍历列表的复杂度为O(n)
,并且由于你对每个元素都这样做,所以总体复杂度为O(n*m)
。如果你先从customer
创建一个id的Set
- 你将提高效率,因为Set
中的contains
复杂度为O(1)
。 - EugeneSet
->HashSet
与例如TreeSet
和O(log n)的区别)- 我是对的吗? - LuCioO(n)
),但在另一个Set中搜索现在是O(1)
;因此,总时间为O(n) + O(1)
,由于O(1)
是常数,因此可以删除它,从而使您的总解决方案为O(n)
- 比之前好得多。 - Eugene