我如何使用Lambda表达式对此进行排序?我想对前7个数字进行排序并排除最后一个数字。我看到可以使用IntStream.concat,但我需要使用Lambda表达式进行排序。
Random random = new Random();
List <Integer> lucky = random.ints (1, 64)
.distinct()
.limit(8)
.boxed()
.sorted()
.collect(Collectors.toList());
“使用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
会更好。
您可以使用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
列表中的项目是不同的。这可以基于索引来完成,但这会使得排序的性能更差。