lambda - 如何使用 Java 8 Lambda 表达式检查列表的正确顺序?

标签 lambda java-8

我有以下方法

private <T> void verify(String message, Supplier<T> targetSupplier,
        Predicate<T> predicate) {
    String verification = "verify that " + message;
    System.out.println(" -> " + verification);
    long start = System.currentTimeMillis();
    while ((System.currentTimeMillis() - start) < timeoutInMs) {
        try {
            T target = targetSupplier.get();
            if (predicate.test(target)) {
                return Verification.ok();
            }
            result = Verification.ko();
        } catch (NotFoundException e) {
            result = Verification.notFound();
        }
    }
}

和一个

    List<String> ABC

如何使用 Java 8 lambda 表达式检查 ABC 是否按升序/降序排列?

非常感谢

最佳答案

我将回答有关检查列表元素是否按正确顺序排列的部分。 (我不知道问题中的 verify 方法和参数的用途。)

流操作对于处理集合(或其他流源)中的单个值效果很好,但对于处理相邻元素来说效果较差。如果您有一个随机访问集合,那么通常可以使用索引流技术并按索引从列表中提取相邻元素,并使用排序谓词对它们进行比较。

由于您想要确定是否所有元素都已排序,因此请使用 Stream.allMatch 来组合应用于所有相邻对的排序谓词的结果。

List<String> ABC = ... ;
boolean sortedAscending =
    IntStream.range(0, ABC.size()-1)
        .allMatch(i -> ABC.get(i).compareTo(ABC.get(i+1)) <= 0));

这将验证列表是否按升序排序。要检查降序,只需在谓词中使用大于而不是小于。

可能有一种巧妙的方法可以使用收集器来做类似的事情,但在我看来,它可能会更复杂。

关于lambda - 如何使用 Java 8 Lambda 表达式检查列表的正确顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24597951/

相关文章:

java - 使用嵌套流连接

java - Java Collectors.toMap内存优化

list - 在流中使用嵌套结构的 Getter

java - 如何运行作为映射上的值的 lambda 表达式

c# - 如何从字符串中为深层属性创建表达式树/lambda

java - 为什么不能并行减少流流?/流已经被操作或关闭

javafx - 如果值为 null 且包含选定值,则禁用组合框

java - 使用 Java 8 设计尾递归

python - Lambda 而不是 "if"语句

c# - 我什么时候应该使用 C# 3.0 附带的 lambda 表达式?