Java:使用lambda表达式对数组进行排序?

3

我最近开始学习函数式编程和Java 8的Lambda表达式。我有一个整数数组,希望将其按升序排序。

我尝试使用Lambda表达式来实现如下操作:

Arrays.stream(intArray).sorted((x, y) -> Integer.compare(x, y) == -1);

这个问题的关键在于我的编译器提示:
Error:(12, 32) java: method sorted in interface 
java.util.stream.IntStream cannot be applied to given types;
required: no arguments
found: (x,y)->Int[...]== -1
reason: actual and formal argument lists differ in length

这里我漏掉了什么?

4
流并不提供对数组进行排序的方式,它们只允许以排序的顺序处理元素。原始数组不会被修改,在你的情况下,由于没有实际操作,什么也不会发生。要对数组进行排序,请使用Arrays.sort(array);,这适用于int[]Integer[]类型的数组。 - Holger
3个回答

5
一个“比较器(Comparator)”需要两个对象并返回一个整数。
在这里,我们使用了两个“Object”,但是返回的是一个布尔表达式(“Integer.compare(x, y) == -1”)。
实际上,您只需要其中的第一部分。
Arrays.stream(intArray)
      .sorted((x, y) -> Integer.compare(x, y))
      .toArray(Integer[]::new);

由于您似乎正在使用一组Integer对象(因为IntStream没有sorted(Comparator)方法),因此最好使用简单的IntStream,这将简化您的生活,因为 int 将按其自然顺序排序。

IntStream#sorted()

返回由此流的元素按排序顺序组成的流。

Arrays.stream(intArray)
      .mapToInt(x->x)
      .sorted()
      .toArray();

那是我的最初方法。但即使这样做,它仍然给我“Integer.Compare(x, y)”不能应用于<lambda表达式>,<lambda表达式>的错误提示。 - Kobek
3
这两者都不完整,因为没有终止操作,它们都不起任何作用。你需要在结尾处加上 toArray() 或类似的方法。 - Brian Goetz
@BrianGoetz 你完全正确。现在好了吗? - Yassin Hajaj
由于结果是由 toArray() 返回的排序数组,因此您应该将结果分配给一个变量(在第一种情况下,将其分配给现有的 intArray 就可以了,在第二种情况下,结果是 int[],其中源是 Integer[])... - Holger
@Kobek:这个已经在这个答案中解释过了... - Holger
显示剩余2条评论

3

您可以做的事情

Arrays.stream(intArray).sorted().forEach(System.out::println);  

您的情况中出现错误是因为IntStream#sorted()不带参数。请参考DEMO

1

Arrays.stream(intArray).sorted()应该用于按特定顺序处理数组。它可以用于排序数组,如其他答案中所述,但它将生成一个新的已排序数组。

Arrays.stream(intArray)
      .sorted((x, y) -> Integer.compare(x, y))
      .toArray(Integer[]::new);

在处理非常大的数据时,这种方法效率不高。
如果您想进行原地排序,可以使用Collections.sort()。
Arrays.sort(arr, (x,y) -> Integer.compare(x,y))

或者在类型为A的对象中,基于字段P进行排序

Arrays.sort(arr, Comparator.comparing(A::getP))

其中getP()是获取字段P值的方法。

在排序方式为倒序时

 Arrays.sort(arr, Comparator.comparing(A::getP).reversed())

在按照两个字段P和P2排序的情况下。
Arrays.sort(arr, Comparator.comparing(A::getP).thenComparing(A::getP2))

如何使用具有多行代码(各种if-else语句)的lambda表达式对原始数组进行排序,例如:int[] arr。可以这样做:Arrays.sort(arr,<多行 lambda>); - PlsWork

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接