String s = Stream.>of(this::first, this::second /*, ... */)
.map(Supplier::get)
.filter(Objects::nonNull)
.findFirst()
.orElseGet(this::defaultOne);
它在第一个非空值上停止,否则设置从defaultOne返回的值.只要你保持顺序,你是安全的.当然这需要Java 8或更高版本.
this :: first等只是方法引用.如果它们是静态的,则用YourClassName :: first替换它等
如果您的方法的签名不同,这是一个例子:
String s = Stream.>of(() -> first("takesOneArgument"),
() -> second("takes", 3, "arguments")
/*, ... */)
.map(Supplier::get)
.filter(Objects::nonNull)
.findFirst()
.orElseGet(this::defaultOne);
请注意,Supplier仅在您打电话时进行评估.这样你就可以得到你懒惰的评估行为.您的供应商lambda表达式中的方法参数必须是最终的或有效的最终.