将 List<String> 直接转换为 List<Integer>

82

"s"中包含AttributeGet:1,16,10106,10111,需要获取属性ID列表中冒号后面的所有数字。有多种方法可以实现,但是否有一种方法可以直接将List<String>转换为List<Integer>?由于下面的代码提示类型不匹配,所以我尝试使用Integer.parseInt,但我认为这对于List无效。其中"s"是一个字符串。

private static List<Integer> attributeIDGet = new ArrayList<Integer>();

if(s.contains("AttributeGet:")) {
    attributeIDGet = Arrays.asList(s.split(":")[1].split(","));
}
14个回答

103

使用Java8:

stringList.stream().map(Integer::parseInt).collect(Collectors.toList());

如果将StringList发送到方法(List<Integer>),则无法完成。我认为需要创建新的List<Integer>并循环。 - Adam
3
@Jagadeesh:如果字符串不是整数,Integer :: parseInt会抛出NumberFormatException。您可以使用例如Apache Commons中的StringUtils :: isNumeric过滤掉非整数元素。 - Dawid Stępień

77
不,您需要循环遍历该数组。
for(String s : strList) intList.add(Integer.valueOf(s));

6
你所写的代码有效地循环遍历数值。但这仍是一种优雅的解决方案。 只需补充说明,使用新的lambda方法: intList.addAll(strList.stream().map(Integer::valueOf).collect(Collectors.toList())); - frugalcoder
1
甚至可以这样写: strList.foreach(s -> intList.add(Integer.valueOf(s))); - Heisenberg
你可以使用Lambda来转换这个列表。 - realPK

11

你可以使用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());

11

使用lambda表达式:

strList.stream().map(org.apache.commons.lang3.math.NumberUtils::toInt).collect(Collectors.toList());


9

Guava转换器可以解决问题。

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"));

8
不,您需要逐个遍历每个元素:
for(String number : numbers) {
   numberList.add(Integer.parseInt(number)); 
}

这种情况发生的原因是没有直接的方法将一个类型的列表转换为任何其他类型。有些转换是不可能的,或者需要以特定的方式完成。基本上,转换取决于涉及的对象和转换的上下文,所以没有“一刀切”的解决方案。例如,如果你有一个Car对象和一个Person对象。你不能直接将List<Car>转换为List<Person>,因为这并没有实际意义。

7
如果您使用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);
            };
        });
    }

我同意上面的答案,这个东西有点臃肿但很时尚。但它只是另一种方式。


4
为什么不使用流将字符串列表转换为整数列表呢?如下所示。
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>();

3
使用流和Lambda:
注:该段内容为标题,无需翻译。
newIntegerlist = listName.stream().map(x-> 
    Integer.valueOf(x)).collect(Collectors.toList());

以上代码将把类型为List<String>的列表转换为List<Integer>
希望对您有所帮助。

3

如果你可以使用 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!


我遇到了这个语法错误:在map函数中无法将String转换为int。你能帮我解决一下吗? - Sonal Maheshwari
@SonalMaheshwari 你使用的Java版本是什么(在哪个环境中)?我在Mac OS X上使用的是1.8.0_05。你能否提供一个SSCCE(在pastebin或等效网站上)? - javatarz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接