Lambda java8流-满足条件时的排序编号

Lambda java8流-满足条件时的排序编号,lambda,java-8,java-stream,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)); publi

我想优化以下代码:

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;
        }
}
输出: 毫米=3 毫米=5 毫米=8

如果满足特定条件,我想对数字进行排序

如何将流直接转换为整数[]? 及

如何将IntStream直接转换为整数[]

如何将流直接转换为整数[]

如何将IntStream直接转换为整数[]

但是,请重新考虑整数[]的使用。如果您处理的是装箱类型,那么最好将它们放在一个列表中,如果使用数组,最好使用基本数组int[]

如何将流直接转换为整数[]

如何将IntStream直接转换为整数[]


但是,请重新考虑整数[]的使用。如果您处理的是装箱类型,也可以将它们放在列表中,如果使用数组,最好使用基本数组int[]

注意,当您必须复制数组以获得不同类型时,您可以简单地使用,例如arrays.copyOfobjArray、objArray.length、Integer[].class来获得Integer[]。这只是为了将来您需要它的情况,在这里,您不需要它,因为您可以简单地调用它。ToArrayIntegrater[]::流上的新内容,以便首先获得正确的数组

但由于后续处理步骤是执行Arrays.asList….forEachdata->System.out.printlnMM=+data;因此,根本不需要收集数据。首先将操作应用于流元素:

numbers.stream()
       .filter(i -> i > 2)
       .sorted()
       .forEachOrdered(data -> System.out.println("MM=" + data));
这也省略了取消装箱和重新装箱步骤


这不使用并行流,您的列表太小,无法从并行处理中获得优势,对于这样简单的任务,您通常需要非常大的列表才能获得优势。但您可以随时将stream替换为parallelStream,并尝试测量是否有好处。

注意,当您必须复制数组以获得不同类型时,您只需使用,例如Arrays.copyOfobjArray、objArray.length、Integer[]类来获得Integer[]。这只是为了将来您需要它的情况,在这里,您不需要它,因为您可以简单地调用它。ToArrayIntegrater[]::流上的新内容,以便首先获得正确的数组

但由于后续处理步骤是执行Arrays.asList….forEachdata->System.out.printlnMM=+data;因此,根本不需要收集数据。首先将操作应用于流元素:

numbers.stream()
       .filter(i -> i > 2)
       .sorted()
       .forEachOrdered(data -> System.out.println("MM=" + data));
这也省略了取消装箱和重新装箱步骤


这不使用并行流,您的列表太小,无法从并行处理中获得优势,对于这样简单的任务,您通常需要非常大的列表才能获得优势。但您可以随时将stream替换为parallelStream,并尝试测量是否有好处。

即使您必须复制数组以获得不同的类型,也可以简单地使用,例如Arrays.copyOfobjArray、objArray.length、Integer[].class来获得Integer[]。但是,您的整个代码包含几个不必要的步骤。您可以使用return.toArrayInteger[]::new;;替换整个方法;;忘记并行流吧,您的列表太小,无法从并行处理中获得优势。或者用numbers.stream.filterpredicate.sorted.forEachOrdereddata->System.out.printlnMM=+数据替换整个代码;假设列表较大,您可以发布此算法的代码吗?您可以用parallelStream替换stream。您可以尝试这两种方法并测量是否有好处。@Seelenvirtuose我正在寻找可以避免这些转换的最小代码。可能的重复即使您必须复制数组以获得不同的类型,您也可以简单地使用,例如Arrays.copyOfobjArray、objArray.length、Integer[]类来获得Integer[]。但是,您的整个代码包含几个不必要的步骤。您可以使用return.toArrayInteger[]::new;;替换整个方法;;忘记并行流吧,您的列表太小,无法从并行处理中获得优势。或者用numbers.stream.filterpredicate.sorted.forEachOrdereddata->System.out.printlnMM=+数据替换整个代码;假设列表较大,您可以发布此算法的代码吗?您可以用parallelStream替换stream。您可以尝试这两种方法并测量是否有好处。@Seelenvirtuose我正在寻找可以避免这些转换的最小代码。……如果OP只需要chain.forEachdata->System.out.printlnMM=+数据,则实际上不需要列表或数组,只要将.forEachOrdereddata->System.out.printlnMM=+数据链接到流中就足够了……如果OP只将.forEachdata->System.out.printlnMM=+数据链接到流中,则实际上不需要列表或数组,只要将.forEachOrdereddata->System.out.printlnMM=+数据链接到流就足够了,因为它与优化有关。在这里使用parallelStream有什么问题?@AdeshKumar parallel pro
访问总是会导致拆分工作、将任务发送到其他线程的开销,这些线程甚至可能必须首先启动,然后才能连接和组装结果。您需要一个真正并行运行的足够大的工作负载,以便在最佳情况下获得补偿:过度补偿开销。对于较小的工作负载,缺点将占主导地位,因为它与优化有关。在这里使用parallelStream有什么问题?@AdeshKumar parallel processing总是会产生拆分工作的开销,将任务发送到其他线程,这些线程甚至可能必须先启动,然后连接并组装结果。您需要一个真正并行运行的足够大的工作负载,以便在最佳情况下获得补偿:过度补偿开销。对于小工作量,缺点将占主导地位。
numbers.stream()
       .filter(i -> i > 2)
       .sorted()
       .forEachOrdered(data -> System.out.println("MM=" + data));