我有一些字符串,如果任何一个为null,则需要返回null。通过Stream实现此目的的方法是什么?还是有更好的方法?
protected String toCombinedString(SomeClass shipment) {
String prefix1 = ofNullable(shipment)
.map(SomeClass::getBill)
.map(Bill::getPrefixString)
.orElse(null);
String prefix2 = ofNullable(shipment)
.map(SomeClass::getBill)
.map(Bill::getPrefixString)
.orElse(null);
String number1 = ofNullable(shipment)
.map(SomeClass::getBill)
.map(Bill::getNumberString)
.orElse(null);
String number2 = ofNullable(shipment)
.map(SomeClass::getBill)
.map(Bill::getNumberString)
.orElse(null);
....
return Stream.of(prefix1, number1, prefix2, number2...)
.filter(Objects::nonNull)
.reduce((a, b) -> a + "-" + b)
.orElseGet(String::new);
}
示例输出组合:
只有通过的情况是,每个String都应该为非空或非null,否则返回null
您似乎执行了三元操作,例如:
return prefix == null || number == null ? null : prefix + "-" + number;
在问题中进行编辑后,结果将仅考虑String
来自Bill
实体的所有此类属性。您可以制定一种String
从所有属性中提取的方法,如下所示:
protected String toCombinedString(SomeClass shipment) {
return Optional.ofNullable(shipment)
.map(SomeClass::getBill)
.map(bill -> extractAttributes(bill, Bill::getNumberString, Bill::getPrefixString)) // use this further
.orElse(null);
}
private String extractAttributes(Bill entity, Function<Bill, String>... mappers) {
List<String> attributes = Arrays.stream(mappers)
.map(function -> function.apply(entity))
.collect(Collectors.toList());
return attributes.stream().anyMatch(s -> s == null || s.isEmpty()) ?
null : String.join("-", attributes);
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句