OptionalStream第2个过滤器,如果第1个过滤器的结果是 Optional.empty()

问题描述 投票:1回答:1

我正在学习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;
}
java filter java-stream optional
1个回答
3
投票

你可以用 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())
© www.soinside.com 2019 - 2024. All rights reserved.