Вероятно, вы захотите, чтобы тип, переданный в getFirstNotNullResult, был Stream [String] вместо List [() => String] и сконструировал его примерно так:
Stream.cons(f1, Stream.cons(f2, Stream.cons(f3, Stream.empty)))
Тогда getFirstNotNullResult изменится на:
fs.filter(_ != null).headOption
Это также будет означать, что он должен действительно возвращать Option [String], так как вы не можете гарантировать, что что-то будет ненулевым.
Как и предполагалось,Причина, по которой я предлагаю Stream, заключается в том, что он оценивает только «хвост» Stream по требованию.Поэтому, если getFirstNotNullResult обнаруживает, что первый элемент не равен нулю, тогда второй параметр первого вызова Stream.cons фактически никогда не выполняется.