java分页中显示更多
快速失败或早期失败是一种软件工程概念,旨在通过在不应该发生的事情发生时立即停止执行来防止复杂问题的发生。 在之前的博客文章和演示中,我将详细介绍这种方法的优点,在此博客文章中,我将详细介绍Java 8中该思想的另一种用法。
在Java中,由Collection类(例如ArrayList,HashSet,Vector等)返回的迭代器快速失败。 这意味着,如果在迭代时尝试从基础数据结构中添加()或remove(),则会收到ConcurrentModificationException。 让我们来看看:
import static java.util.Arrays.asList;
List ints = new ArrayList<>(asList(1,2,3,4,5,6,9,15,67,23,22,3,1,4,2));for (Integer i: ints) {// some codeints.add(57); // throws java.util.ConcurrentModificationException
}
在Java 8u20中,Collections.sort()API也会快速失败。 这意味着您也不能在迭代内调用它。 例如:
import static java.util.Arrays.asList;
List ints = new ArrayList<>(asList(1,2,3,4,5,6,9,15,67,23,22,3,1,4,2));for (Integer i: ints) {// some codeCollections.sort(ints); // throws java.util.ConcurrentModificationException
}
这是有道理的。 遍历数据结构并在迭代过程中对其进行排序不仅是反直观的,而且还可能导致不可预测的结果。 现在,您可以避免这种情况,并且如果在调用排序后立即中断,就不会出现异常。
import static java.util.Arrays.asList;
List ints = new ArrayList<>(asList(1,2,3,4,5,6,9,15,67,23,22,3,1,4,2));for (Integer i: ints) {// some codeCollections.sort(ints); // throws java.util.ConcurrentModificationExceptionbreak;
}
但是,这几乎不是很棒的代码。 尝试避免使用旧的skool迭代,并尽可能使用Lambda。 但是,如果您遇到困难,只需在迭代之外进行排序
import static java.util.Arrays.asList;
List ints = new ArrayList<>(asList(1,2,3,4,5,6,9,15,67,23,22,3,1,4,2));
Collections.sort(ints);for (Integer i: ints) {// some code
}
或使用添加时排序的数据结构。
Java 8版本20中引入了Collections.sort()API的新行为。 值得一看的是详细介绍API更改的特定部分:
”
领域 :core-libs / java.util.collections
简介 :Collection.sort推迟到List.sort
以前, Collection.sort
复制列表中的元素以将其排序到一个数组中,对该数组进行排序,然后使用该数组中的这些元素和默认方法就地更新列表。
List.sort
推迟到Collection.sort。 这是非最佳的安排。
从8u20版本开始, Collection.sort
推迟到List.sort
。 这意味着,例如,使用ArrayList
实例调用Collection.sort
现有代码现在将使用ArrayList实现的最佳排序。
”
我认为,如果Oracle在此方面更明确地说明这种更改如何引起运行时问题,那将有所帮助。 考虑到每个人都使用Collections框架,如果以前没有抛出异常的API现在可以在相同的情况下使用(错误代码及其全部内容),那么发行说明使开发人员更容易找到信息会更好。
翻译自: https://www.javacodegeeks.com/2017/11/fail-early-java-8.html
java分页中显示更多