我正在学习Optional、Streams和不同的功能接口,这两者都可以使用,所以在这里请大家勉强。
我有一个方法,我想改变。
public Optional<Package> getPackage(String holderID, String packageID){
Holder holder = service.getHolder(holderID);
return holder.getPackages().stream()
.filter(model-> StringUtils.equalsIgnoreCase(packageID,model.getPackageId())).findAny();
}
持有者有一个领域。
List<Package> packages;
包有领域。
String packageId;
String packageType;
我感兴趣的是扩展该方法,使其在第一个结果为空的Optional时进行额外的过滤。有没有这样一种方法,当第一次过滤的结果是空可选的时候,可以像我上面那样先按packageId过滤,再按packageType过滤(比如packageType=="type1")?
我想总的来说,我想知道如果一个 只有当它的结果是非空的Optional或Stream时,才会进行过滤。 方法有哪些?
有没有比这更好的方法。
public Optional<Package> getPackage(String holderID, String packageID){
Holder holder = service.getHolder(holderID);
Optional<Package> package = holder.getPackages().stream()
.filter(model-> StringUtils.equalsIgnoreCase(packageID,model.getPackageId())).findAny();
if(package.isEmpty()){
package = holder.getPackages().stream()
.filter(model -> StringUtils.equalsIgnoreCase("type1",model.getPackageType()))
.findAny();
}
return package;
}
你可以用 Optional.or()
(从Java 9开始可用),你可以向其传递一个 Supplier
归来的 Optional
:
holder.getPackages().stream()
.filter(model-> StringUtils.equalsIgnoreCase(packageID,model.getPackageId())).findAny()
.or(() -> holder.getPackages().stream()
.filter(model -> StringUtils.equalsIgnoreCase("type1",model.getPackageType()))
.findAny())