我正在尝试使用lambda表达式将String数组转换为Integer数组。
我在下面提供了我的代码,以及到目前为止我所尝试的内容的简要说明:
String [] inputData = userInput.split("\\s+");
Integer [] toSort = new Integer [] {};
try {
toSort = Arrays.asList(inputData).stream().mapToInt(Integer::parseInt).toArray();
}catch(NumberFormatException e) {
System.out.println("Error. Invalid input!\n" + e.getMessage());
}
我上面的lamba表达式是一个映射到int数组的表达式,这不是我想要的,在编译这段代码时我得到以下错误信息:
BubbleSort.java:13: error: incompatible types: int[] cannot be converted to Integer[]
toSort = Arrays.asList(inputData).stream().mapToInt(Integer::parseIn
t).toArray();
^
1 error
是否有一种简单的方法可以让我使用lambdas或其他方法从String数组到Integer数组?
答案 0 :(得分:5)
mapToInt(Integer::parseInt).toArray()
返回int[]
数组,因为matToInt
生成IntStream
但int[]
数组不能被Integer[]
引用使用(拳击)仅适用于基本类型,而不是基本类型。
您可以使用的是
import java.util.stream.Stream;
//...
toSort = Stream.of(inputData)
.map(Integer::valueOf) //value of returns Integer, parseInt returns int
.toArray(Integer[]::new); // to specify type of returned array
答案 1 :(得分:5)
正如其他人已经指出的那样,mapToInt
会返回IntStream
,其toArray
方法将返回int[]
而不是Integer[]
。除此之外,还有其他一些需要改进的地方:
Integer [] toSort = new Integer [] {};
是初始化数组的一种不必要的复杂方法。使用
Integer[] toSort = {};
或
Integer[] toSort = new Integer[0];
但是你根本不应该初始化它,如果你打算覆盖它的话。如果要为异常情况设置回退值,请在异常处理程序中执行赋值:
String[] inputData = userInput.split("\\s+");
Integer[] toSort;
try {
toSort = Arrays.stream(inputData).map(Integer::parseInt).toArray(Integer[]::new);
}catch(NumberFormatException e) {
System.out.println("Error. Invalid input!\n" + e.getMessage());
toSort=new Integer[0];
}
此外,请注意您在案例中不需要String[]
数组:
Integer[] toSort;
try {
toSort = Pattern.compile("\\s+").splitAsStream(userInput)
.map(Integer::parseInt).toArray(Integer[]::new);
}catch(NumberFormatException e) {
System.out.println("Error. Invalid input!\n" + e.getMessage());
toSort=new Integer[0];
}
Pattern
是指java.util.regex.Pattern
,它与String.split
内部使用的是同一类。
答案 2 :(得分:2)
如果您想要Integer
数组,请不要映射到IntStream
,映射到Stream<Integer>
:
toSort = Arrays.asList(inputData).stream().map(Integer::valueOf).toArray(Integer[]::new);