排序列表 使用Lambda表达式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了排序列表 使用Lambda表达式相关的知识,希望对你有一定的参考价值。

我如何使用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列表中的项目是不同的。这可以基于索引来完成,但这会使得排序的性能更差。

以上是关于排序列表 使用Lambda表达式的主要内容,如果未能解决你的问题,请参考以下文章

使用lambda表达式按字段排序

csharp C#使用Lambda表达式为动态类型和动态属性排序通用列表

请教如何使用lambda分组后排序

java 8中列表对象多条件排序

python--lambda表达式在sort函数中的使用

Java lambda date排序