Pascal4eg

 Java | Фишки и трюки

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");
}