2016-12-04 8 views
0

の要素を確認して取得する方法を知りたい場合は、Mapを参照してください。 Java 8バージョン - 条件付きリストのマップ

private Map<User, List<Offer>> shops = new ConcurrentHashMap<>(32); 

//how to write this? 
public List<Offer> getOffersOlderThan(int seconds){ 
    return this.shops.values().stream().forEach(
       x->x.stream() 
        .filter(y-> MyTime.currentTime.minusSeconds(seconds) 
             .isBefore(y.getOfferBegin())) 
} 

は、私はすでに filter代わりに、最初の forEachを使用しようとしましたが、それはどちらか動作しませんでした。

すべてOfferListのうち、TimestampcurrentTime - secondsより前に取得されたいと考えています。

Java 8で汎用リストを返すにはどうすればよいですか? 例:すべてのオファーについては

public List<Offer> getOffersByUser(User u){ 
    return this.shops.entrySet().stream().filter(x->x.getKey().getId()==u.getId()) 
       .collect(List::new) //how to parameterize? 
} 
+0

どのようにちょうど使用について 'this.shops.get(U)特定のユーザーのオファーを取得するには?それがマップのすべてです。 –

+0

forEach()はvoidを返します。したがって、forEach()が返すものについては、どのメソッドも呼び出すことはできません。いくつかのドキュメントを読む必要があります。 –

+0

@jbn AFAICT OPは* all *のユーザーからのオファーを希望します – Bohemian

答えて

4

、唯一のユーザーの申し出についてflatMap()collect()

return shops.values().stream() 
    .flapMap(List::stream) 
    .filter(y-> MyTime.currentTime.minusSeconds(seconds).isBefore(y.getOfferBegin()) 
    .collect(Collectors.toList()); 

を使用します。

return shops.getOrDefault(user, Collections.emptyList()) 
    .filter(y-> MyTime.currentTime.minusSeconds(seconds).isBefore(y.getOfferBegin()) 
    .collect(Collectors.toList()); 
+0

Thumbのルールとして、コレクション内にCollectionがある場合は常にflatMap()を使用する必要があります。これは、内部Collectionのみを返すためです。 – EsoMoa

+0

'flatMap()'はストリームの要素を(サブ)ストリームに変換します。これらのストリームは連結されて単一の最終ストリームを形成します。 'flatMap()'は要素からストリームを生成する関数を提供します。だから、大丈夫です。 – Bohemian

関連する問題