使用反向比较器对流进行排序

时间:2016-07-05 04:56:14

标签: java sorting java-8 java-stream

我想在第二列上使用比较器对包含两列的数组进行排序,然后颠倒顺序。

数组是:

String[][] names = {{"a", "1234"}, {"b", "12312"}, {"c", "43"}};

并返回我使用的排序数组:

String[][] out = Arrays.stream(names)
    .sorted(
        Comparator.comparing(x -> x[1])
    )
    .toArray(String[][]::new);

哪种方法效果很好,但是当我尝试使用reversed()来尊重排序顺序时:

String[][] out = Arrays.stream(names)
    .sorted(
        Comparator.comparing(x -> x[1]).reversed()
    )
    .toArray(String[][]::new);

我收到错误:

Error:(44, 66) java: array required, but java.lang.Object found

我的IDE突出显示了x[1]部分中的 x 。我做错了什么?

1 个答案:

答案 0 :(得分:3)

当您添加comparing()链调用时,编译器无法将通用类型参数推断为.reversed(),因此您必须明确地给它们。

首先,您需要了解comparing()的完整声明:

static <T,U extends Comparable<? super U>> Comparator<T> comparing(Function<? super T,? extends U> keyExtractor)

它有两个类型参数:

  • T - 函数的输入(lambda),即你的String[]
  • U - 函数的返回值,即您案例中的String

所以你可以写:

Comparator.<String[], String>comparing(x -> x[1]).reversed()

或者,您可以在lambda中指定参数类型(即T),编译器将推断U

Comparator.comparing((String[] x) -> x[1]).reversed()

这可能就是你想要的方式。

如果您愿意,也可以对第一个进行其中任何一个。这些都是一样的,只是变得越来越明确:

Comparator.comparing(x -> x[1])
Comparator.comparing((String[] x) -> x[1])
Comparator.<String[], String>comparing(x -> x[1])
Comparator.<String[], String>comparing((String[] x) -> x[1])