Java8中,可以通过流的sorted操作对流中的元素排序,sorted操作的参数是Comparator接口,通过传入一个比较函数来实现排序操作,最直接的,就是通过形如
(a, b) -> {
int n = Math.min(a.size(), b.size());
for (int i = 0; i < n; i++) {
if (a.get(i) > b.get(i)) {
return 1;
} else if (a.get(i) < b.get(i)) {
return -1;
}
}
return 0;
}
这样的lambda表达式来实现,当a>b时,返回一个正数,a<b时,返回一个负数,a=b时,返回0(Compares its two arguments for order. Returns a negative integer, zero, or a positive integer as the first argument is less than, equal to, or greater than the second.),比较的逻辑写在lambda表达式中,灵活、方便、高效。如果流中的数据还需要再做一些处理再比较,可以通过Comarator.comparing中的第一个参数,Function<? super T, ? extends U> keyExtractor来处理。例如:
Comparator.comparing(k -> k, (a, b) -> {
int n = Math.min(a.size(), b.size());
for (int i = 0; i < n; i++) {
if (a.get(i) > b.get(i)) {
return 1;
} else if (a.get(i) < b.get(i)) {
return -1;
}
}
return 0;
})
代码示例:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
public class StreamSortedTest {
public static void main(String[] args) {
List<List<Integer>> data = new ArrayList<>();
data.add(Arrays.asList(1, 1, 1, 1, 1));
data.add(Arrays.asList(1, 1, 1, 2));
data.add(Arrays.asList(5));
data.add(Arrays.asList(1, 2, 2));
data.add(Arrays.asList(1, 4));
data.add(Arrays.asList(2, 3));
data.add(Arrays.asList(1, 1, 3));
data.forEach(System.out::println);
System.out.println("-----------------------");
data.stream().sorted((a, b) -> {
int n = Math.min(a.size(), b.size());
for (int i = 0; i < n; i++) {
if (a.get(i) > b.get(i)) {
return 1;
} else if (a.get(i) < b.get(i)) {
return -1;
}
}
return 0;
}).forEach(System.out::println);
System.out.println("-----------------------");
data.stream().sorted(Comparator.comparing(k -> k, (a, b) -> {
int n = Math.min(a.size(), b.size());
for (int i = 0; i < n; i++) {
if (a.get(i) > b.get(i)) {
return 1;
} else if (a.get(i) < b.get(i)) {
return -1;
}
}
return 0;
})).forEach(System.out::println);
}
}
打印输出:
[1, 1, 1, 1, 1]
[1, 1, 1, 2]
[5]
[1, 2, 2]
[1, 4]
[2, 3]
[1, 1, 3]
-----------------------
[1, 1, 1, 1, 1]
[1, 1, 1, 2]
[1, 1, 3]
[1, 2, 2]
[1, 4]
[2, 3]
[5]
-----------------------
[1, 1, 1, 1, 1]
[1, 1, 1, 2]
[1, 1, 3]
[1, 2, 2]
[1, 4]
[2, 3]
[5]
Process finished with exit code 0