Java 8 lambdas 分组缩减和映射

标签 java java-8 java-stream

给定一个 List以下 Transaction类,使用 Java 8 lambda,我想获得一个 ListResultantDTO ,每个帐户类型一个。

public class Transaction {

    private final BigDecimal amount;
    private final String accountType;
    private final String accountNumber;

}

public class ResultantDTO {

    private final List<Transaction> transactionsForAccount;

    public ResultantDTO(List<Transaction> transactionsForAccount){
        this.transactionsForAccount = transactionsForAccount;
    }

}

到目前为止,我使用以下代码对 List<Transaction> 进行分组通过 accountType .

Map<String, List<Transaction>> transactionsGroupedByAccountType = transactions
    .stream()
    .collect(groupingBy(Transaction::getAccountType));

如何返回 List<ResultantDTO> ,将每个映射键的列表传递给构造函数,其中包含一个 ResultantDTOaccountType

最佳答案

您可以在单流操作中执行此操作:

public List<ResultantDTO> convert(List<Transaction> transactions) {
    return transactions.stream().collect(
            collectingAndThen(
                groupingBy(
                        Transaction::getAccountType,
                        collectingAndThen(toList(), ResultantDTO::new)),
                map -> new ArrayList<>(map.values())));
}

这里 collectingAndThen 使用了两次:一次用于下游 Collector 将列表转换为 ResultantDTO 对象,一次用于将结果映射转换为列表它的值(value)观。

关于Java 8 lambdas 分组缩减和映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30758206/

相关文章:

java - 如何在 Java 中使用 OpenCV 检测图像中的线条

java - 使用按钮显示闹钟计时器

Java 8如何使用Stream检查一个数字是否除以多个数字

Java 8 减去日期但保留小时

java - CompletableFuture 与 flatMap 的等价物是什么?

java - 从 Stream<String> 创建 Map<Integer, Set<String>>

java - 如何使用 java 8 lambda 和流对 Map<YearMonth, List<LocalDate>> 进行排序

java - Java递归查找链表中的 'maximum'字符

java - 更换开关盒 : interface vs abstract class

java - 在具体类中调用超接口(interface)的非抽象方法