将来自不同类层次结构路由的两个字段用于 map-filter lambda 表达式

我们有一个方法,它接收类层次结构顶部的类的对象。它使用基于层次结构中某个位置的字段的条件,如果满足该条件,则它为构建器使用另一个字段,该字段也在层次结构中的某个位置,但位于从顶级开始的不同路径上。


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 以供构建器使用。这是否可行?


噜噜哒
浏览 224回答 3
3回答

幕布斯6054654

你不应该说这样的话:.map(x -> new SimpleEntry<>(this.getFieldOne(x), this.getFieldTwo(x))).filter(e -> evaluateTheCondition(e.getKey())).map(Entry::getValue).ifPresent(builder::withFieldTwo);

ITMISS

由于您不需要 getFieldOne,因此您不应该映射到它,否则您将无法返回另一个 getFieldTwo 的映射;我建议你首先使用没有方法引用的过滤器,如果它评估为真映射 tto getFieldTwo:Optional.of(entity) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.filter(p->someCondition.evaluate(p.getSomething().getFieldOne())) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.map(this::getFieldTwo)&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.ifPresent(builder::withFieldTwo);
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java