如何使用Lambda表达式对此进行排序? 我想对前7个数字进行排序,并排除最后一个数字。我看到可以使用IntStream.concat,但是我需要使用Lambda表达式进行排序。
Random random = new Random();
List <Integer> lucky = random.ints (1, 64)
.distinct()
.limit(8)
.boxed()
.sorted()
.collect(Collectors.toList());
答案 0 :(得分:3)
“使用lambda表达式”的要求很奇怪。我只需将.limit
调用替换为
.limit(((IntSupplier)() -> 8).getAsInt())
看!我在那里用过lambda! () -> 8
。然后,您可以按照您所说的继续concat
来解决问题。
显然,这不是您的意思。
如果要将lambda放入sort
方法中以对前7个整数进行排序,然后始终将第8个整数保留在最后,则可以执行以下操作:
Random random = new Random();
List<Integer> unsorted = random.ints(1, 64)
.distinct()
.limit(8)
.boxed()
.collect(Collectors.toList());
// here you need to get the last element that you don't want to sort
int last = unsorted.get(unsorted.size() - 1);
// here is the lambda
List<Integer> sorted = unsorted.stream().sorted((x, y) -> {
if (Integer.compare(x, y) == 0) {
return 0;
}
// if any one of the arguments is the last one...
if (last == x) {
return 1;
}
if (last == y) {
return -1;
}
return Integer.compare(x, y);
}).collect(Collectors.toList());
// you can also use "List.sort" with the same lambda
请注意,我个人认为此sorted
方法调用非常不可读。乍一看,我看不到您正在尝试对除最后一个以外的所有内容进行排序。就可读性而言,使用concat
会更好。
答案 1 :(得分:2)
您可以将lambda用作Collections.sort()
的第二个参数,并提供子列表作为第一个参数:
Collections.sort(lucky.subList(0, lucky.size()-1),
(i1, i2) -> i1.compareTo(i2));
这等效于Collections.sort(lucky.subList(0, lucky.size()-1))
,因此您在这里实际上不需要此lambda表达式。
另一种方法(不是有效的方法)将使用Stream.concat()
:
List<Integer> sorted = Stream.concat(
lucky.stream()
.filter(elem -> !elem.equals(lucky.get(lucky.size() - 1))).sorted(),
Stream.of(lucky.get(lucky.size() - 1)))
.collect(Collectors.toList());
请注意,由于lucky
列表中的项目是不同的,因此我将根据值(而不是索引)过滤第一个流中的项目。可以根据索引来完成此操作,尽管这会使排序的性能更差。