我想找到最有效的方法来找到集合的第一个元素,这是在另一个集合中,我也采取第一个条目。我觉得这很"丑"。解决方案。
public class UnitLine {}
public class Unit {
private Collection<UnitLine> unitLines;
public Collection<UnitLine> getUnitLines() {
return unitLines;
}
}
public class Wrapper {
Collection<Unit> units;
public Collection<Unit> getUnits() {
return units;
}
}
public static void main(String[] args) {
Wrapper wrapper = new Wrapper();
Unit unit = wrapper.getUnits().stream().findFirst().orElseGet(null);
if (unit != null) {
UnitLine unitLine = unit.getUnitLines().stream().findFirst().orElseGet(null);
if (unitLine != null) {
// do something
}
}
}
将Optional转换为null意味着您无法利用Optional的优秀特性。下面是等效的代码,它有用地使用了可选的map
和orElse
:
UnitLine unitLine = wrapper.getUnits().stream()
.findFirst()
.map(Unit::getLines)
.orElse(Collections.emptySet()).stream()
.findFirst()
.orElse(null);
该代码获取第一个集合的第一个元素,如果第一个集合为空,则获取null
。要获取第一个非空集合的第一个元素,可以使用flatMap
:
wrapper.getUnits().stream()
.map(Unit::getUnitLines)
.flatMap(Collection::stream)
.findFirst()