spa*_*ker 95 java lambda optional java-8 java-stream
我有下面的代码,对于多次空检查有点难看.
String s = null;
if (str1 != null) {
s = str1;
} else if (str2 != null) {
s = str2;
} else if (str3 != null) {
s = str3;
} else {
s = str4;
}
Run Code Online (Sandbox Code Playgroud)
所以我尝试使用Optional.ofNullable如下所示,但如果有人读取我的代码仍然很难理解.在Java 8中这样做的最佳方法是什么.
String s = Optional.ofNullable(str1)
.orElse(Optional.ofNullable(str2)
.orElse(Optional.ofNullable(str3)
.orElse(str4)));
Run Code Online (Sandbox Code Playgroud)
在Java中9,我们可以使用Optional.ofNullable同OR,但在Java8还有没有其他办法?
Rav*_*ala 167
你可以这样做:
String s = Stream.of(str1, str2, str3)
.filter(Objects::nonNull)
.findFirst()
.orElse(str4);
Run Code Online (Sandbox Code Playgroud)
Era*_*ran 72
三元条件运算符怎么样?
String s =
str1 != null ? str1 :
str2 != null ? str2 :
str3 != null ? str3 : str4
;
Run Code Online (Sandbox Code Playgroud)
ern*_*t_k 33
你也可以使用循环:
String[] strings = {str1, str2, str3, str4};
for(String str : strings) {
s = str;
if(s != null) break;
}
Run Code Online (Sandbox Code Playgroud)
wal*_*len 26
目前的答案很好,但你真的应该把它放在一个实用工具方法:
public static Optional<String> firstNonNull(String... strings) {
return Arrays.stream(strings)
.filter(Objects::nonNull)
.findFirst();
}
Run Code Online (Sandbox Code Playgroud)
这种方法已经在我的Util班上多年,使代码更清洁:
String s = firstNonNull(str1, str2, str3).orElse(str4);
Run Code Online (Sandbox Code Playgroud)
你甚至可以把它变成通用的:
@SafeVarargs
public static <T> Optional<T> firstNonNull(T... objects) {
return Arrays.stream(objects)
.filter(Objects::nonNull)
.findFirst();
}
// Use
Student student = firstNonNull(student1, student2, student3).orElseGet(Student::new);
Run Code Online (Sandbox Code Playgroud)
Mic*_*son 13
我使用辅助函数,如
T firstNonNull<T>(T v0, T... vs) {
if(v0 != null)
return v0;
for(T x : vs) {
if (x != null)
return x;
}
return null;
}
Run Code Online (Sandbox Code Playgroud)
然后这种代码可以写成
String s = firstNonNull(str1, str2, str3, str4);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7263 次 |
| 最近记录: |