11
votes

Utilisation de flux pour une conversion de sécurité nulle d'un tableau à une liste

Je recherche un moyen succinct de réécrire un morceau de code Java afin qu'il utilise des flux pour convertir un tableau en une liste de manière totalement sûre. Voici le code d'origine:

Arrays.stream(ints).collect(Collectors.toList());

J'ai pensé à faire quelque chose comme ça:

// psuedocode that obviously doesn't compile
Optional.ofNullable(ccAddresses).SOMETHING.orElse(Collections.emptyList());

où QUELQUE CHOSE serait dans le sens de:

public MailObject toMailObject(final String[] ccAddresses) {
    final MailObject mailObject = new MailObject();

    // line of code to be altered
    mailObject.setCcAddresses(ccAddresses == null 
        ? Collections.emptyList() : Arrays.asList(ccAddresses));

    // other necessary code

    return mailObject;
}

mais je n'arrive pas à comprendre la syntaxe tout à fait correctement.

Cette question a été utile mais n'a pas répondu exactement à mon problème. Quelqu'un pourrait-il m'indiquer la bonne direction? J'ai l'impression d'être proche ...

Merci beaucoup pour votre temps.


3 commentaires

Votre code d'origine semble assez succinct


Assez juste, mais je suis curieux de savoir la meilleure façon de le faire en utilisant des flux.


.map(Arrays::asList)


3 Réponses :


7
votes

À mon avis, le code que vous avez jusqu'à présent est parfaitement lisible. Je pense que l'utilisation d'un Stream pour quelque chose comme ça ne fera que compliquer les choses. Si vous souhaitez toujours utiliser un Stream , quelque chose comme ce qui suit fonctionnerait:

mailObject.setCcAddresses(Optional.ofNullable(ccAddresses)
          .map(Arrays::asList)
          .orElse(Collections.emptyList()));

Comme vous pouvez le voir, c'est un plus illisible, et je ne le recommanderais pas sur votre simple expression ternaire.


Votre solution Optional est légèrement plus lisible et ressemblerait à ceci:

mailObject.setCcAddresses(Stream.ofNullable(ccAddresses)
          .flatMap(Arrays::stream)
          .collect(Collectors.toUnmodifiableList()));


2 commentaires

Stream.ofNullable nécessite Java 9 et Collectors.toUnmodifiableList() nécessite même Java 10. Et lorsque vous utilisez Java 9 ou plus récent, vous pouvez également changer le code d'origine en mailObject.setCcAddresses(ccAddresses == null? List.of(): List.of(ccAddresses)); , dont la simplicité soulignera encore plus la bêtise d'utiliser Optional ou Stream ici.


Bon aperçu des versions Java List.of() la première solution ... et aussi de la possibilité List.of() ! Entre ceci et la réponse complète de @Jacob G., il y a beaucoup d'options ici; Merci!



9
votes

Vous pouvez utiliser la map :

List<String> ccAddrs = Optional.ofNullable(ccAddress)
                               .map(Arrays::asList)
                               .orElse(Collections.emptyList())


1 commentaires

Je m'étais demandé si la méthode .map() pouvait être utile; merci pour l'utilisation complète en contexte.



0
votes

Vous pouvez essayer avec mon code testé fort:

Méthode de type fixe:

Subarata
Taluker
Software Engineer

Méthode de type générique:

String[] names = {"Subarata", "Talukder", null, "Software Engineer"};
Integer[] marks = {100, 55, null, 25, 66, null, 88};
    
// Print all null safe items
for (String name : nullSafeConversion(names)) {
    // Show null safe data
    System.out.println(name);
}

Comment appeler:

public static <E> List<E> nullSafeConversion(final E[] e) {
    // Initialize all to a list
    List<E> eList = Arrays.asList(e);
    // Create a null safe Stream
    Stream<E> eStream = eList.stream().flatMap(Stream::ofNullable);
    // return collected list from stream
    return eStream.collect(Collectors.toList());
}

Les sorties:

public static List<String> nullSafeConversion(final String[] names) {
     // Initialize all to a list
     List<String> namesList = Arrays.asList(names);
     // Create a null safe Stream
     Stream<String> nameStream = namesList.stream().flatMap(Stream::ofNullable);

     // return collected list from stream
     return nameStream.collect(Collectors.toList());
}


0 commentaires