直接将List <String>转换为List <Integer>
parsing我的文件后,包含AttributeGet:1,16,10106,10111
所以我需要在属性IDGet列表中获得分号后的所有数字。 我知道有几种方法可以做到这一点。 但有什么办法,我们可以直接将List<String>
转换为List<Integer>
。 由于下面的代码抱怨types不匹配,所以我试图做Integer.parseInt,但我想这不会为列表工作。 这里s是String。
private static List<Integer> attributeIDGet = new ArrayList<Integer>();; if(s.contains("AttributeGet:")) { attributeIDGet = Arrays.asList(s.split(":")[1].split(",")); }
不,你需要遍历数组
for(String s : strList) intList.add(Integer.valueOf(s));
使用Java8:
stringList.stream().map(Integer::parseInt).collect(Collectors.toList());
使用lambda:
strList.stream().map(org.apache.commons.lang3.math.NumberUtils::toInt).collect(Collectors.toList());
不,你将不得不遍历每个元素:
for(String number : numbers) { numberList.add(Integer.parseInt(number)); }
发生这种情况的原因是没有简单的方法将一种types的列表转换为任何其他types。 有些转换是不可能的,或者需要以特定的方式完成。 从本质上说,转换取决于所涉及的对象和转换的上下文,因此没有“一刀切”的解决scheme。 例如,如果你有一个Car
对象和一个Person
对象。 您不能直接将List<Car>
转换为List<Person>
,因为它没有任何意义。
番石榴转换器做的伎俩。
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"));
如果您使用Google Guava库 ,那么您可以执行此操作,请参阅Lists#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); }; }); }
是的,同意上面的答案,这是臃肿,但时尚。 但这只是另一种方式。
为什么不使用stream将string列表转换为整数列表? 如下所示
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());
完整的操作可能是这样的
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>();
如果您可以使用Java 8中的lambdas,则可以使用以下代码示例。
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);
没有使用外部库。 简单的旧的新Java!
不,我没有办法(我知道),在Java中这样做。
基本上你必须将每个条目从String转换为Integer。
你正在寻找的可以用更多的function语言来实现,在这个语言中你可以传递一个转换函数并将其应用到列表中的每一个元素上……但这是不可能的(它仍然适用于列表中的每个元素)。
矫枉过正:
但是,您可以使用Google Guava中的函数(http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/Function.html)来模拟更实用的方法,如果是你在找什么。;
如果你担心遍历列表两次,那么不要使用Tokenizer进行拆分,而是在添加到列表之前将每个整数标记转换为Integer。
您可以使用Java 8的Lambda函数来实现这一点,而无需循环
String string = "1, 2, 3, 4"; List<Integer> list = Arrays.asList(string.split(",")).stream().map(s -> Integer.parseInt(s.trim())).collect(Collectors.toList());
这是展示番石榴威力的另一个例子。 虽然这不是我编写代码的方式,但是我想把它打包在一起,以显示Guava为Java提供的函数式编程。
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>();