Java的8两个列表流

导演:

我有一个方法需要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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章