【问题标题】:How to abstract method call in lamba expression?如何在 lambda 表达式中抽象方法调用?
【发布时间】:2021-12-10 22:28:45
【问题描述】:

给定以下两种方法(不是可编译的代码,只是结构):

  protected String mapABC(
    Entity entity, @Context MappingContext mappingContext) {
    return Optional.ofNullable(getSomething(entity))
      .map(
        x ->  getBlah(x::getName))
      .orElse(null);
  }

  protected String mapXYZ(
    Entity entity, @Context MappingContext mappingContext) {
    return Optional.ofNullable(getSomething(entity))
      .map(
        x ->  getBlah(x::getFirstName))
      .orElse(null);
  }

我正在考虑避免重复逻辑时的外观,以便可以编写类似这样的结构:

protected String mapXYZ(
    Entity entity, @Context MappingContext mappingContext) {
    return xxx(getName());
  }

  protected String mapXYZ(
    Entity entity, @Context MappingContext mappingContext) {
    return xxx(getFirsName());
  }


  private String xxx(Methodreference m){
    return Optional.ofNullable(getSomething(entity))
      .map(
        x ->  getBlah(x::m))
      .orElse(null);
  }

x 的类型是:

@AllArgsConstructor
@NoArgsConstructor
@Data
@Builder(toBuilder = true)
public class DetailData {
  private String name;
  private String firstname;
}

我可以尝试任何想法吗?

【问题讨论】:

  • x的类型是什么?
  • @Sweeper:我会在上面添加这个信息

标签: java lambda stream abstract


【解决方案1】:

你应该采取Function<DetailData, String>

private String map(Function<DetailData, String> m){
    return Optional.ofNullable(getSomething(entity))
        .map(
            x -> getBlah(m.apply(x)))
        .orElse(null);
}

用法:

protected String mapXYZ(
    Entity entity, @Context MappingContext mappingContext) {
    return map(DetailData::getName);
}

protected String mapXYZ(
    Entity entity, @Context MappingContext mappingContext) {
    return map(DetailData::getFirstName);
}

【讨论】:

  • 很好,解决了我的问题-谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
  • 1970-01-01
相关资源
最近更新 更多