【发布时间】:2022-03-05 08:02:30
【问题描述】:
我无法用 Java Streams 编写以下条件。假设我有一个元素周期表中的元素列表。我必须编写一个方法,通过检查列表是否包含硅或镭或两者来返回字符串。如果它只有硅,方法必须返回Silicon。如果它只有镭,方法必须返回Radium。如果两者都有,方法必须返回Both。如果它们都不可用,则方法返回""(默认值)。
目前,我写的代码如下。
String resolve(List<Element> elements) {
AtomicReference<String> value = new AtomicReference<>("");
elements.stream()
.map(Element::getName)
.forEach(name -> {
if (name.equalsIgnoreCase("RADIUM")) {
if (value.get().equals("")) {
value.set("RADIUM");
} else {
value.set("BOTH");
}
} else if (name.equalsIgnoreCase("SILICON")) {
if (value.get().equals("")) {
value.set("SILICON");
} else {
value.set("BOTH");
}
}
});
return value.get();
}
我知道代码看起来更混乱,看起来比功能更重要。但我不知道如何使用流以更好的方式编写它。我还考虑过多次通过列表过滤元素Silicon 和Radium 并在此基础上完成的可能性。但是遍历列表两次似乎效率不高。
注意:我也明白这可以用命令式的方式编写,而不是与流和原子变量复杂化。我只是想知道如何使用流编写相同的逻辑。
请分享您对使用 Java Streams 实现相同目标的更好方法的建议。
【问题讨论】:
-
元素 { 字符串名称; int atomicNumber; }
标签: java if-statement java-stream