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)