【问题标题】:Lookup enum value in a map to initialise list在映射中查找枚举值以初始化列表
【发布时间】:2017-10-03 10:46:23
【问题描述】:

鉴于我有以下Map 并致电writeMetadata(...)

Map<Report, TransferStatus> transferStatusMap = sftpService.transfer(reportDeliverables);

dbMetadataWriter.writeMetadata(successReports);

ENUM 为:

public enum TransferStatus {
    SUCCESS,
    FAILURE
}

首先,如何使用 Java 8 创建包含所有 Report 且状态为 TransferStatus.SUCCESSsuccessReport 列表?

其次,在调用dbMetadataWriter.writeMetadata(successReports); 之前,应该检查是否存在任何成功的值。

最后,一般应该如何处理失败的传输?实际上,最佳实践是什么?

【问题讨论】:

    标签: java enums java-8 maps


    【解决方案1】:
     List<Report> successReports = transferStatusMap.entrySet()
              .stream()
              .filter(e -> e.getValue() == TransferStatus.SUCCESS)
              .map(Entry::getKey)
              .collect(Collectors.toList());
    
     if(!reports.isEmpty()){
         dbMetadataWriter.writeMetadata(successReports);
     }
    

    或者您可以将它们都收集到Map

    Map<TransferStatus, List<Report>> map = 
         transferStatusMap.entrySet()
                          .stream()
                          .collect(Collectors.groupingBy(
                                Entry::getValue,
                                Collectors.mapping(Entry::getKey, Collectors.toList()));
    

    【讨论】:

    • 我喜欢你之前的第二个例子。它会创建多个Success 的密钥吗?否则我只能使用 2 个表示成功和失败的键。
    • @user2781389 多个相同键在Map?
    • 如果我要将 Report 添加到同一个 ENUM 密钥,那么在这种情况下,密钥将是唯一的吗?关于问题最后部分的任何想法:)
    【解决方案2】:

    您可以将成功报告列表创建为:

    Map<Report, TransferStatus> transferStatusMap = sftpService.transfer(reportDeliverables);
    
    List<Report> successReports = transferStatusMap.entrySet().stream().filter(e -> e.getValue().equals(TransferStatus.SUCCESS))
                .map(Map.Entry::getKey)
                .collect(Collectors.toList());
    

    如果地图中存在任何此类条目,则类似地 writeMetaData

    Map<Report, TransferStatus> transferStatusMap = sftpService.transfer(reportDeliverables);
    
    if(transferStatusMap.entrySet().stream().anyMatch(x->x.getValue().equals(TransferStatus.SUCCESS))) {
            dbMetadataWriter.writeMetadata(successReports);
    }
    

    注意:如果这些是连续或连续的语句,@Eugene's solution 最好对现有数据类型进行 isEmpty() 检查。

    【讨论】:

    • 让我们称之为偶数,想投反对票 ;) ...当一个简单的successReports.size() &gt; 0 可以做到时,你为什么要打电话给anyMatch
    • @Eugene 很好地同意只是以一种解耦的方式解决了,当你看到你的答案时,它并不是真正需要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-28
    • 2011-04-08
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    相关资源
    最近更新 更多