Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:使用lambda表达式对数组排序?_Java_Sorting_Lambda_Functional Programming_Java 8 - Fatal编程技术网

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

Java:使用lambda表达式对数组排序?,java,sorting,lambda,functional-programming,java-8,Java,Sorting,Lambda,Functional Programming,Java 8,我最近学习了函数式编程和Java8Lambdas。我有一个整数数组,我想按升序排序 我试图用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 giv

我最近学习了函数式编程和Java8Lambdas。我有一个整数数组,我想按升序排序

我试图用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

我错过了什么

A
Comparator
获取两个
Object
并返回一个
int

这里,我们输入两个
对象,但返回一个布尔表达式(
整数。比较(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).sorted().forEach(System.out::println);  
您案例中的错误是因为不接受参数

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

Arrays.stream(intArray)
      .sorted((x, y) -> Integer.compare(x, y))
      .toArray(Integer[]::new);
如果是非常大的数据,这将是无效的

如果要进行就地排序,可以使用Collections.sort()

或者,对于类型为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))

这是我最初的做法。但即使这样做,它仍然会给我“Integer.Compare(x,y)”无法应用于@Kobek,请您发布完整的代码好吗?使用
intArray
,它将有助于重现问题;因为没有终端操作,所以也不做任何事情。你希望在结尾处有一个
toArray()
。@BrianGoetz你完全正确。现在更好了吗?因为结果是
toArray()
返回的排序数组,所以应该将结果分配给一个变量(在第一种情况下,将其分配给现有的
intArray
就可以了,在第二种情况下,结果是
int[]
其中源是
Integer[]
)…流不提供对数组进行排序的方法,它们允许按排序顺序处理元素。原始数组不会被修改,在您的情况下,因为没有实际操作,所以不会发生任何事情。要对数组进行排序,请使用
Arrays.sort(array)
这将适用于
int[]
Integer[]
。如何使用具有多行的lambda对原始数组进行排序,如
int[]arr
。类似这样:
Arrays.sort(arr,)
 Arrays.sort(arr, Comparator.comparing(A::getP).reversed())
Arrays.sort(arr, Comparator.comparing(A::getP).thenComparing(A::getP2))