gpt4 book ai didi

java 8并行流按给定值组织列表

转载 作者:行者123 更新时间:2023-11-29 06:54:24 25 4
gpt4 key购买 nike

如果元素少则向左移动如果多则向右移动。 Java 7 风格的简单代码:

private static <T extends Comparable> List<T> doAction(List<T> original, T state) {
List<T> left = new ArrayList<T>();
List<T> fight = new ArrayList<T>();
for (T e : original) {
if (e.compareTo(state) < 0) {
left.add(e);
} else {
fight.add(e);
}
}
left.addAll(fight);
return left;
}

如何使用并行流将上面的代码重写为 java 8 流样式?

最佳答案

与您的原始代码等效的一种方法是:

private static <T extends Comparable<T>> List<T> doAction(List<T> original, T state) {
Map<Boolean, List<T>> collect = original.parallelStream()
.collect(Collectors.partitioningBy(e -> e.compareTo(state) < 0));
List<T> left = collect.get(true);
List<T> right = collect.get(false);
return Stream.of(left, right).flatMap(List::stream).collect(Collectors.toList());
}

但是,由于您只对数据进行分区,然后再加入它们,一个更简单的解决方案是:

private static <T extends Comparable<T>> List<T> doAction(List<T> original, T state) {
return original.parallelStream()
.sorted(Comparator.comparingInt(e -> Integer.signum(e.compareTo(state))|1))
.collect(Collectors.toList());
}

但请注意,无论哪种情况,您都需要相当大的源列表才能从并行执行中获益。


请注意,第二种方法甚至可以就地执行,以防原始 List 是可变的(并且您不再需要原始顺序):

original.sort(Comparator.comparingInt(e -> Integer.signum(e.compareTo(state))|1));

关于java 8并行流按给定值组织列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37461223/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com