加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – 使用来自不同类层次结构路由的两个字段进行map-filter l

发布时间:2020-12-15 08:27:19 所属栏目:Java 来源:网络整理
导读:我们有一个方法,它在类层次结构的顶部接收类的对象.它使用基于层次结构中更深层的字段的条件,如果满足,则它使用构建器另一个字段,也可以在层次结构中更深的位置但在从顶级类开始的不同路径上. public OptionalSomeType create(final TopClassInHierarchy top
我们有一个方法,它在类层次结构的顶部接收类的对象.它使用基于层次结构中更深层的字段的条件,如果满足,则它使用构建器另一个字段,也可以在层次结构中更深的位置但在从顶级类开始的不同路径上.

public Optional<SomeType> create(final TopClassInHierarchy topClass) {
  Optional<SomeType> someObject = Optional.empty();
  if (someCondition.evaluate(getFieldOne(topClass))) {
      someObject = Optional.of(new SomeType.Builder()
              .withFieldTwo(getFieldTwo(topClass))
              .build());
  }
  return someObject;

private FieldOne getFieldOne(TopClassInHierarchy topClass) { return topClass.getSomething()...getFieldOne();
private FieldTwo getFieldTwo(TopClassInHierarchy topClass) { return topClass.getSomethingElse()...getFieldTwo();

我们希望最好将其浓缩为一个声明,如下所示

SomeType.Builder builder = new SomeType.Builder();
Optional.of(topClass)
        .map(this::getFieldOne)
        .filter(someCondition::evaluate)
        .map(this::getFieldTwo) //???
        .ifPresent(builder::withFieldTwo);

但是,一旦我们将topClass向下映射到fieldOne以进行条件评估,之后我们似乎无法“退回”到topClass以将其映射到fieldTwo以用于构建器.一个声明是否可行?

解决方法

如果认为这应该工作:

public Optional<SomeType> create(final TopClassInHierarchy topClass) {
  Builder builder = new Builder();

  return Optional.of(topClass)
    .filter(tc -> someCondition.evaluate(getFieldOne(tc)))
    .map(tc -> builder.withFieldTwo(getFieldTwo(tc)).build());
}

someCondition.evaluate在filter中需要fieldOne作为输入,但要将topClass保持为Optional的当前状态,我们不会映射到fieldOne.而是使用方法getFieldOne.如果过滤器被传递,我们可以将topClass映射到由方法getFieldTwo检索的fieldTwo上应用的构建器的结果.

或者使用更多中间映射:

public Optional<SomeType> create(final TopClassInHierarchy topClass) {
    Builder builder = new Builder();

    return Optional.of(topClass)
            .filter(tc -> someCondition.evaluate(getFieldOne(tc)))
            .map(this::getFieldTwo)
            .map(builder::withFieldTwo)
            .map(Builder::build);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读