直接从http://docs.oracle.com/javase/tutorial/collections/interfaces/list.html
public static <E> void replace(List<E> list, E val, E newVal) {
for (ListIterator<E> it = list.listIterator(); it.hasNext(); )
if (val == null ? it.next() == null : val.equals(it.next()))
it.set(newVal); }
这个例子中唯一的小技巧是val和it.next之间的相等性测试。您需要特殊情况下val值为null,以防止NullPointerException。
我想知道为什么我们需要特殊的val值为null来防止NullPointerException。我可能会理解,我们需要安全的代码来防止NullPointerException,然而,这一行代码
if (val == null ? it.next() == null : val.equals(it.next()))
与集合迭代无关,而是只在参数方法中指定val参数。
感谢您对上述内容的任何澄清。
发布于 2013-03-24 16:24:34
您对这里发生的事情的理解是完全正确的:他们正在讨论的“特殊情况”与空检查参数有关,而不是与列表的迭代有关。
实际上,您可以将if
语句移出循环之外,以获得一种效率稍高但可读性较低的解决方案:
if (val != null) {
for (ListIterator<E> it = list.listIterator(); it.hasNext(); )
if (val.equals(it.next()))
it.set(newVal);
} else {
for (ListIterator<E> it = list.listIterator(); it.hasNext(); )
if (it.next() == null)
it.set(newVal);
}
发布于 2013-03-24 16:24:00
该测试封装了两个在val
中定位list
的不同规则。
val
是null
,那么列表元素必须是null
才能匹配(回想一下,列表可以包含null
值)val
不是null
,那么val
必须等于(使用.equals()
)列表元素才能匹配当NullPointerException
是null
时,如果您试图评估val.equals(list.next())
,那么val
就会出现。
这个方法可以写成这样:
public static <E> void replace(List<E> list, E val, E newVal) {
if (val == null) {
for (ListIterator<E> it = list.listIterator(); it.hasNext(); )
if (it.next() == null)
it.set(newVal);
} else {
for (ListIterator<E> it = list.listIterator(); it.hasNext(); )
if (val.equals(it.next()))
it.set(newVal);
}
}
https://stackoverflow.com/questions/15600886
复制相似问题