監督:
私はこの方法は、パラメータとして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()));