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 Réponses :
À 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()));
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!
Vous pouvez utiliser la map
:
List<String> ccAddrs = Optional.ofNullable(ccAddress) .map(Arrays::asList) .orElse(Collections.emptyList())
Je m'étais demandé si la méthode .map()
pouvait être utile; merci pour l'utilisation complète en contexte.
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()); }
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)