Après avoir analysé mon fichier "s" contient AttributeGet:1,16,10106,10111
Donc, je dois obtenir tous les nombres après le colon dans la liste attributeIDGet. Je sais qu'il y a plusieurs façons de le faire. Mais pouvons-nous directement convertir List<String>
en List<Integer>
? Comme le code ci-dessous se plaint de l'incompatibilité de types, j'ai donc essayé de faire Integer.parseInt, mais je suppose que cela ne fonctionnera pas pour List. Voici s String.
private static List<Integer> attributeIDGet = new ArrayList<Integer>();
if(s.contains("AttributeGet:")) {
attributeIDGet = Arrays.asList(s.split(":")[1].split(","));
}
Non, vous devez faire une boucle sur le tableau
for(String s : strList) intList.add(Integer.valueOf(s));
Utilisation de Java8:
stringList.stream().map(Integer::parseInt).collect(Collectors.toList());
Convertisseurs de goyave faire le tour.
import com.google.common.base.Splitter;
import com.google.common.primitives.Longs;
final Iterable<Long> longIds =
Longs.stringConverter().convertAll(
Splitter.on(',').trimResults().omitEmptyStrings()
.splitToList("1,2,3"));
Non, vous devrez parcourir chaque élément:
for(String number : numbers) {
numberList.add(Integer.parseInt(number));
}
Cela s’explique par le fait qu’il n’existe aucun moyen simple de convertir une liste d’un type en un autre type. Certaines conversions ne sont pas possibles ou doivent être effectuées de manière spécifique. Essentiellement, la conversion dépend des objets impliqués et du contexte de la conversion, de sorte qu'il n'y a pas de solution "taille unique". Par exemple, si vous aviez un objet Car
et un objet Person
. Vous ne pouvez pas convertir un List<Car>
en un List<Person>
directement car cela n’a pas vraiment de sens.
Si vous utilisez la bibliothèque Google Guava voici ce que vous pouvez faire, voir Listes # transform
String s = "AttributeGet:1,16,10106,10111";
List<Integer> attributeIDGet = new ArrayList<Integer>();
if(s.contains("AttributeGet:")) {
List<String> attributeIDGetS = Arrays.asList(s.split(":")[1].split(","));
attributeIDGet =
Lists.transform(attributeIDGetS, new Function<String, Integer>() {
public Integer apply(String e) {
return Integer.parseInt(e);
};
});
}
Oui, d'accord avec la réponse ci-dessus, c'est que c'est gonflé, mais élégant. Mais c'est juste une autre façon.
Pourquoi n'utilisez-vous pas stream pour convertir une liste de chaînes en une liste d'entiers?
List<String> stringList = new ArrayList<String>(Arrays.asList("10", "30", "40",
"50", "60", "70"));
List<Integer> integerList = stringList.stream()
.map(Integer::valueOf).collect(Collectors.toList());
opération complète pourrait être quelque chose comme ça
String s = "AttributeGet:1,16,10106,10111";
List<Integer> integerList = (s.startsWith("AttributeGet:")) ?
Arrays.asList(s.replace("AttributeGet:", "").split(","))
.stream().map(Integer::valueOf).collect(Collectors.toList())
: new ArrayList<Integer>();
Si vous êtes autorisé à utiliser lambdas à partir de Java 8, vous pouvez utiliser l'exemple de code suivant.
final String text = "1:2:3:4:5";
final List<Integer> list = Arrays.asList(text.split(":")).stream()
.map(s -> Integer.parseInt(s))
.collect(Collectors.toList());
System.out.println(list);
Pas d'utilisation de bibliothèques externes. Plaine vieux nouvelle Java!
Vous pouvez utiliser les fonctions Lambda de Java 8 pour y parvenir sans bouclage.
String string = "1, 2, 3, 4";
List<Integer> list = Arrays.asList(string.split(",")).stream().map(s -> Integer.parseInt(s.trim())).collect(Collectors.toList());
Non, il n'y a aucun moyen (que je sache) de le faire en Java.
En gros, vous devrez transformer chaque entrée de String en Integer.
Ce que vous recherchez pourrait être réalisé dans un langage plus fonctionnel, dans lequel vous pourriez passer une fonction de transformation et l'appliquer à chaque élément de la liste ... mais ce n'est pas possible (cela s'appliquerait toujours à tous les éléments de la liste. ).
Overkill:
Vous pouvez toutefois utiliser une fonction de Google Guava (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Function.html) pour simuler une approche plus fonctionnelle, si est ce que vous cherchez.
Si vous craignez de parcourir la liste deux fois, utilisez plutôt un Tokenizer au lieu de scinder et transformez chaque jeton d'entier en entier avant de l'ajouter à la liste.
Utilisation de Streams et Lambda:
newIntegerlist = listName.stream().map(x->
Integer.valueOf(x)).collect(Collectors.toList());
La ligne de code ci-dessus convertira la liste de type List<String>
en List<Integer>
.
J'espère que c'était utile.
Voici un autre exemple pour montrer le pouvoir de la goyave. Bien que ce ne soit pas la façon dont j'écris le code, je souhaitais l'intégrer pour montrer le type de programmation fonctionnelle que Java fournit à Guava.
Function<String, Integer> strToInt=new Function<String, Integer>() {
public Integer apply(String e) {
return Integer.parseInt(e);
}
};
String s = "AttributeGet:1,16,10106,10111";
List<Integer> attributeIDGet =(s.contains("AttributeGet:"))?
FluentIterable
.from(Iterables.skip(Splitter.on(CharMatcher.anyOf(";,")).split(s)), 1))
.transform(strToInt)
.toImmutableList():
new ArrayList<Integer>();