2016-12-04 4 views
0

Я хочу знать, как проверять и извлекать элементы List внутри 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, но это не сработало.

Я хочу, чтобы получить List всех Offer, который имеет Timestamp перед currentTime - 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 (и) 'получить предложения данного пользователя? Вот что такое карта. –

+0

forEach() возвращает void. Поэтому вы не можете вызвать какой-либо метод для того, что возвращает forEach(). Вам нужно прочитать некоторую документацию. –

+0

@jbn AFAICT OP хочет предложения от * всех * пользователей – 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

Так как правило большого пальца я должен всегда использовать flatMap(), когда у меня есть коллекция внутри коллекции, потому что это «возврат» только внутренней коллекции? – EsoMoa

+0

'flatMap()' превращает элементы потока в (под) потоки, которые объединены в один конечный поток. Вы предоставляете 'flatMap()' функцию для создания потока из элемента. Итак, да, это хорошее эмпирическое правило. – Bohemian

Смежные вопросы