Stream API
Stream API появился в Java 8 и существенно упростил работу с коллекциями. Теперь можно писать короче и красивее фильтрацию, сортировку и обработку данных.
Ниже приведены примеры использования stream API.
private final List properties = getProperties();
/**
* Поиск свойства по имени в списке
* @param propName наименование свойства
* @return найденное свойство или null если не найдено
*/
public Property getPropertyByName(String propName) {
return properties.stream().filter(p -> p.getName().equals(propName)).findFirst().orElse(null);
}
/**
* Получить сумму балансов всех счетов клиента
* @param accounts список счетов
* @return сумма балансов всех счетов клиента
*/
public BigDecimal getTotalBalance(List accounts) {
return accounts.stream()
.map(a -> a.getBalance() != null ? a.getBalance() : ZERO)
.reduce(ZERO, BigDecimal::add);
}
/**
* Возвращает Мар, где ключ это идентификатор клиента, а значение это объект клиента
* @param clients список клиентов
* @return Мар, где ключ это идентификатор клиента, а значение это объект клиента
*/
public Map getIdClientMap(List clients) {
return clients.stream().collect(Collectors.toMap(Client::getId, Function.identity()));
}
/**
* Группировка счетов клиента
* @param accounts список счетов
* @return Мар, где ключ это клиент, а значение это список его счетов
*/
private Map> getClientAccountMap(List accounts) {
return accounts.stream().collect(groupingBy(Account::getClient));
}
/**
* @param accounts список счетов
* @return true - если все счета клиента активны, false - если хотя бы один не активен
*/
public boolean isAllAccountsActive(List accounts) {
return accounts.stream().allMatch(a -> "ACTIVE".equals(a.getState()));
}
public void blockAllActiveAccounts(List accounts) {
accounts.stream()
.filter(a -> "ACTIVE".equals(a.getState()))
.forEach(this::blockAccount);
}
public void blockAccount(Account account) {
account.setState("BLOCKED");
}