java8 stream - 如果条件满足则排序编号

时间:2018-03-09 07:53:34

标签: lambda java-8 java-stream

我想优化以下代码:

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[]

2 个答案:

答案 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[]