我最近进入了函数式编程和Java 8 lambdas。我有一系列的整数,我想按升序排序。
我尝试用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
我在这里缺少什么?
答案 0 :(得分:5)
Comparator
需要两个Object
并返回int
。
在这里,我们使用两个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();
答案 1 :(得分:3)
你可以做到
Arrays.stream(intArray).sorted().forEach(System.out::println);
您的案例中的错误是因为IntStream#sorted()
不接受参数。
答案 2 :(得分:0)
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())
如果在2个字段P和P2上进行排序
Arrays.sort(arr, Comparator.comparing(A::getP).thenComparing(A::getP2))