2016-03-13 7 views
0

Я видел этот фрагмент кода на Java Tutorial Oracle, однако, как бы я ни старался попробовал, я не могу понять if (val == null ? it.next() == null : val.equals(it.next())).Не могу понять: if (val == null? It.next() == null: val.equals (it.next()))

Какова его функция и как она работает?

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); 
} 
+2

это тройная операция его скелет, если (условие) operation1: работы2; если условие истинно, оно выбирает operation1 else 2.Speaking это просто, если код else в одной строке - это блог, который объясняет подробно.http: //alvinalexander.com/java/edu/pj/pj010018 – SmashCode

+1

Хотя это законная Java (это компилирует), слишком плохо, что появляется в учебнике. –

ответ

1

Это проверка равенства между val и it.next(). null.equals() будет кидать NullPointerException, поэтому условие используется, чтобы этого избежать.

if (// the if statement 
    val == null ? // let me name this "condition A" 
     it.next() == null : // this will be evaluated if condition A is true 
     val.equals(it.next()) // this will be evaluated if condition A is false 
) // the if statement 
-1

Этот код пытается найти val в списке, а затем заменяет его newVal

for (ListIterator<E> it = list.listIterator(); it.hasNext();) 
     if (val == null && it.next() == null) 
     { } 
     else if val.equals(it.next())) 
      it.set(newVal); 
+0

1. Этот код может вызывать 'it.next()' дважды в одном цикле. 2. Этот код не будет вызывать 'it.set (newVal);' когда оба 'val' и' it.next() 'являются' null', в то время как исходный код будет. – MikeCAT