我正在进行一个邮局存储练习,其中部分方法使用另一个方法searchBoxes,其参数是Predicate.我必须使用searchBoxes来实现这些方法,但我不能像以前那样使用lambda表达式.

这是我必须用途:的searchBoxes个方法

public List<Box> searchBoxes(Predicate<Box> predicate) {
    if(predicate == null) {
        throw new NullPointerException();
    }
    List<Box> selected = new LinkedList<>();
    for(Box box : parcels) {
        if(predicate.test(box)) {
            selected.add(box);
        }
    }
    return selected;
}

这是另一种方法:

public List<Box> getAllWeightLessThan(double weight) {
    if(weight < 1) {
        throw new IllegalArgumentException();
    }
    List<Box> result = searchBoxes(e -> e.getWeight() < weight);
    return result;
}

我需要做的是避免使用lambda表达式,在这里我调用了searchBoxes方法:searchBoxes(e -> e.getWeight() < weight);,但问题是我必须使用searchBoxes方法.

如何避免这种情况并以相同的方式调用该方法,但没有lambda呢?

推荐答案

只需做一个正常的实现:

public class MaxWeightPredicate implements Predicate<Box> {
  
  private final double maxWeight;

  public MaxWeightPredicate(double maxWeight) {
    this.maxWeight = maxWeight;
  }

  @Override
  public boolean test(Box box) {
    return box.getWeight() < this.maxWeight;
  }
}

和用法:

List<Box> result = searchBoxes(new MaxWeightPredicate(weight));

或者使用匿名类,但必须在可以访问weight的地方声明它:

Predicate<Box> predicate = new Predicate<Box>() {
  @Override
  public boolean test(Box box) {
    return box.getWeight() < weight;
  }
};

Java相关问答推荐

Java 21虚拟线程会解决转向react 式单线程框架的主要原因吗?

找到允许的最大底片

如何粘合(合并)文件Lucene?

为什么我们仍然需要实现noArgsConstructor如果Java默认提供一个非参数化的构造函数?''

扩展到弹出窗口宽度的JavaFX文本字段

嵌入式ActiveMQ Artemis Web控制台加载错误

使用传递的参数构造异常的Mockito-doThrow(或thenThrow)

无法初始化JPA实体管理器工厂:无法确定为Java类型<;类>;推荐的JdbcType

Bean定义不是从Spring ApplationConext.xml文件加载的

为什么Collectors.toList()不能保证易变性

根本不显示JavaFX阿拉伯字母

AWS Java SDK v2.x中没有setObjectAcl方法

具有多个分析模式的复杂分隔字符串的正则表达式

如何在特定关键字后提取与模式匹配的多个值?

";home/runner/work/中没有文件...匹配到[**/pom.xml];Maven项目的构建过程中出现错误

JOOQ:批处理CRUD操作使用动态表定义,如何?

如何在单元测试中获得我的装饰Mapstruct映射器的实例?

如何正确使用java.time类?

Xml Reader 将 BMP 外部的字符解析为代理项对,这会导致无效的 xml

语句打印在错误的行(Java Token 问题)