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

时间:2014-07-06 16:30:11

标签: 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是否按升序/降序排列?

非常感谢

2 个答案:

答案 0 :(得分:11)

我将回答有关检查列表元素是否顺序正确的部分。 (我不知道问题中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));

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

可能有一种聪明的方法可以使用收藏家来做类似的事情,但似乎我觉得它会更复杂。

答案 1 :(得分:2)

根据Stuart Marks的建议,这是我的最终代码

public void inAscOrder() {
    verify("stringInASCOrder",
            this::findMultiple,
            elements -> IntStream.range(0, elements.size() - 1).allMatch(
                    i -> elements.get(i).getText()
                            .compareTo(elements.get(i + 1).getText()) <= 0));
}