二つのリストを使用してJava 8の流れ

監督:

私はこの方法は、パラメータとして2つのリストを受け取り、あなたは、私はいくつかのフィルタリングを行うと、呼び出し元に結果を返すしたいメソッド本体に見ることができるように持っています。私は、ラムダ式を使用して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からIDのをCustomerことを持つHashSetあなたが今呼び出すことができるcontainsため、興味のあるIDを持つことで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()));

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=178005&siteId=1