2017-10-03 4 views
2

Étant donné que je donne les résultats suivants Map et appeler à writeMetadata(...):Recherche valeur ENUM dans une carte à initialisez liste

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

dbMetadataWriter.writeMetadata(successReports); 

ENUM comme:

public enum TransferStatus { 
    SUCCESS, 
    FAILURE 
} 

Tout d'abord, comment puis-je créer la liste successReport avec tous Report avec le statut TransferStatus.SUCCESS avec Java 8?

Deuxièmement, avant l'appel à dbMetadataWriter.writeMetadata(successReports); il devrait y avoir une vérification pour voir si des valeurs avec succès existent.

et, en général, comment gérer les transferts ayant échoué? Pratiquement, quelle est la meilleure pratique?

Répondre

3
List<Report> successReports = transferStatusMap.entrySet() 
      .stream() 
      .filter(e -> e.getValue() == TransferStatus.SUCCESS) 
      .map(Entry::getKey) 
      .collect(Collectors.toList()); 

if(!reports.isEmpty()){ 
    dbMetadataWriter.writeMetadata(successReports); 
} 

Ou vous pouvez les chercher à la fois à un Map:

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

J'ai aimé le deuxième exemple que vous aviez précédemment. Va-t-il créer plusieurs clés de 'Success'? ou il n'y aura que 2 clés dites succès et échec que je peux travailler avec. – user2781389

+0

@ user2781389 modifié pour l'ajouter l'exemple 'Map' – Eugene

+0

@ user2781389 * plusieurs clés identiques dans une' Map'? – Eugene

0

Vous pouvez créer la liste des successReports comme:

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()); 

Similairement writeMetaData si une telle entrée dans la carte existe

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

if(transferStatusMap.entrySet().stream().anyMatch(x->x.getValue().equals(TransferStatus.SUCCESS))) { 
     dbMetadataWriter.writeMetadata(successReports); 
} 

Remarque: Si ce sont des déclarations consécutives ou séquentiels, @Eugene's solution est mieux à faire isEmpty() vérifier sur le type de données existant.

+2

appelons-le même, voulait descendre voter;) ... pourquoi appelleriez-vous 'anyMatch' quand un simple' successReports.size()> 0 'ferait? – Eugene

+0

@Eugene bien convenu juste résolu de manière découplée et tout en regardant votre réponse réalisée, ce n'est pas vraiment nécessaire. – nullpointer