@Test public void P17_havingEnoughMoney() { // when Map items = shopList.stream() .map(Shop::getItemList) .flatMap(List::stream) .distinct() .collect(Collectors.toMap(i -> i.getName(), i -> i.getPrice(), (a, b) -> Math.min(a, b))); final List customerNameList = customerList.stream() .filter(i -> sum(i.getWantToBuy(), items) <= i.getBudget()) .filter(i -> haveall(i.getWantToBuy(), items)) .map(Customer::getName) .collect(Collectors.toList()); // then assertThat(customerNameList).hasSize(8); assertThat(customerNameList).containsOnly("Joe", "Steven", "Patrick", "Diana", "Kathy", "Alice", "Martin", "Amy"); } private Long sum(List itemList, Map priceLookup) { return itemList.stream() .collect(Collectors.summingLong(i -> priceLookup.getOrDefault(i.getName(), 0))); } private Boolean haveall(List itemList, Map priceLookup) { return itemList.stream() .allMatch(i -> priceLookup.containsKey(i.getName())); }