Вот мой пример:
import java.util.ArrayList;
import java.util.stream.IntStream;
public class Example {
public static void main( String[] args ) {
ArrayList<Integer> list = new ArrayList<>();
list.add(0);list.add(1);list.add(2);
SomeObject a = IntStream.range(0,list.size())
.filter(i->list.get(i)==3 || list.get(i)==4)
.mapToObj(i->new SomeObject(i,list.get(i)))
.findFirst()
.orElse(null);
System.out.println(a);
}
}
class SomeObject{
int index;
int value;
SomeObject(int index,int value){
this.index=index;
this.value=value;
}
@Override
public String toString() {
return this.index+" "+this.value;
}
}
Почему, когда мы вызываем System.out.println(a);, мы не получаем NullPointerException?
Поскольку orElse (null) возвращает объект, указывающий на null. Если нет, то в чем разница между нулем в методе orElse и объектом, указывающим на нуль?
почему это не относится к необязательному указанию на null. из-за этого я был сбит с толку. если я поставил .get (); вместо orElse (null) я получу исключение.
ради этого SomeObject b =null; System.out.println(b); тоже не бросит NPE. Твердо верю, что это дубликат. Голосование закрыть как дублирующее. В связанном вопросе есть ответ, в котором указано, что вызывает NPE.




Поехали немного подробнее ...
System.out.println(a); называет эту перегрузку println:
public void println(Object x)
в котором говорится:
Prints an Object and then terminate the line. This method calls at first String.valueOf(x) to get the printed object's string value, then behaves as though it invokes print(String) and then println().
Учитывая вышеизложенное, перейдем к методу String.valueOf:
public static String valueOf(Object obj)
в котором говорится:
Returns: if the argument is null, then a string equal to "null"; otherwise, the value of obj.toString() is returned.
Поскольку obj - это нулевой, возвращается "ноль" и obj.toString() никогда не вызывается, следовательно, нет исключения.
Что касается вашего следующего комментария:
why it is not the case for an optional pointing to null. for that i was confused.if i put .get(); in place of orElse(null), i will get an exception.
Optional<T> не «указывает на нуль» (используется неправильная терминология, обычно мы говорим, что параметр Optional либо имеет состояние настоящее время, либо состояние отсутствует).
Следует избегать небрежного вызова .get() из Optional<T>, если только вы не уверены, что Optional<T> не пустой.
В этом случае вы получаете NoSuchElementException просто потому, что в нем нет значения, и это задокументировано в API Optional<T>.
why it is not the case for an optional pointing to null.
Чтобы ответить на этот комментарий, поскольку я думаю, что это то, что вы пытаетесь задать в вопросе, см. Этот отвечать.
Необязательный, представленный в Java 8, представляет собой объект-контейнер, который используется для содержат, в частности, ненулевые объекты.. Вместо этого необязательный объект используется для представления null с отсутствующим значением.
Тот факт, что метод findFirst () возвращает Optional, является спорным дизайнерским решением. Но так оно и есть сейчас.
System.out.printlnможет распечатать ссылку наnull.