我想优化以下代码:
List<Integer> numbers = Arrays.asList(5, 3, 2, 8);
// sorted Array of all numbers>2
Arrays.asList(sortWithCondition(numbers, i -> i > 2)).forEach(
data -> System.out.println("MM=" + data));
public static Integer[] sortWithCondition(List<Integer> numbers,
Predicate<Integer> predicate) {
IntStream intStream = numbers.parallelStream().filter(predicate)
.mapToInt(i -> i).sorted();
Object[] objArray = intStream.boxed().collect(Collectors.toList())
.toArray();
Integer[] intArray = new Integer[objArray.length];
for (int j = 0; j < intArray.length; j++) {
intArray[j] = (Integer) objArray[j];
}
return intArray;
}
}
输出: MM = 3 MM = 5 MM = 8
如果满足特定条件,我想对数字进行排序。
如何直接将Stream<Integer>
转换为Integer[]
?
和
如何直接将IntStream
转换为Integer[]
?
答案 0 :(得分:3)
请注意,当您必须复制数组以获得其他类型时,您可以简单地使用,例如得到Arrays.copyOf(objArray, objArray.length, Integer[].class)
Integer[]
。这只是因为你将来需要它,因为在这里,你不需要它,因为你可以简单地在流上调用.toArray(Integer[]::new)
来获得正确的数组。
但是,由于您的后续处理步骤是对结果执行Arrays.asList(…).forEach(data -> System.out.println("MM=" + data));
,因此根本不需要收集数据。首先将操作应用于流元素:
numbers.stream()
.filter(i -> i > 2)
.sorted()
.forEachOrdered(data -> System.out.println("MM=" + data));
这也省略了拆箱和重拳步骤。
这不使用并行流,您的列表太小而无法从并行处理中获得优势,对于这样简单的任务,您通常需要一个非常大的列表才能获得好处。但您可以随时将stream()
替换为parallelStream()
,并尝试衡量是否有利益。
答案 1 :(得分:2)
如何直接将Stream转换为Integer []?
stream.toArray(Integer[]::new);
如何直接将IntStream转换为Integer []?
intstream.boxed().toArray(Integer[]::new);
但是,请重新考虑使用Integer[]
。如果您正在处理盒装类型,也可以将它们放在List<Integer>
中,如果您使用数组,最好使用基本数组int[]