如何在 Java 8 中创建条件排序

Fak*_*ode 5 java java-8 java-stream

假设我有一个通过排序函数返回的点列表:

List<Point> points = new ArrayList<>(); 
points.add(new Point(3, 30)); 
points.add(new Point(1, 10)); 
points.add(new Point(2, 20));

points.stream() 
.sorted((p1, p2)->p1.x.compareTo(p2.x)) 
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

如何根据布尔标志 ( sortThePoints) 使排序(...) 成为条件,如下所示

points.stream()
if(sortThePoints){
 .sorted((p1, p2)->p1.x.compareTo(p2.x)) 
}
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)

Mạn*_*yễn 9

Stream.sorted(Comparator)如果流是有序的,则进行稳定排序。换句话说,如果两个元素相等,那么它们将保持其初始顺序。

static final Comparator<Point> identityComparator = (p1, p2) -> 0;

Comparator<Point> normalComparator = (p1, p2)->p1.x.compareTo(p2.x);

(or Comparator<Point> normalComparator = Comparator.comparing(p -> p.x))

points.stream()
.sorted(sortThePoints ? normalComparator : identityComparator)
.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)


ern*_*t_k 5

您可以使用变量来打破链条:

Stream<Point> pointStream = points.stream();

if(sortThePoints) {
    pointsStream = pointsStream.sorted((p1, p2)->p1.x.compareTo(p2.x));
}

pointsStream.forEach(System.out::println);
Run Code Online (Sandbox Code Playgroud)