java - 怎样才能更好地抽象?

标签 java java-stream simplify

给定一个具有两个相似方法的 util 类,仅在字段 setter/getter 方面有所不同:

public static void method_A(Dbo dbo) {
    if (dbo instanceof Zdbo) {
      ((Zdbo)dbo)
          .getSome()
          .forEach(z -> z.setFieldX(dbo.getFieldX()));
    }
  }

public static void method_B(Dbo dbo) {
    if (dbo instanceof Zdbo) {
      ((Zdbo)dbo)
          .getSome()
          .forEach(z -> z.setFieldZ(dbo.getFieldZ()));
    }
  }

我的问题是:如何消除重复的代码?

我的方法是实现这样的目标:

private static void xxx(Dbo dbo, Consumer c) {
    if (dbo instanceof Zdbo) {
      ((Zdbo)dbo).getSome().forEach(c);
    }
  }

最佳答案

public static Stream<Zdbo> getSome(Dbo dbo) {
    return dbo instanceof Zdbo ? ((Zdbo)dbo).getSome() : Stream.empty();
}

public static Optional<Zdbo> asZdbo(Dbo dbo) {
    return dbo instanceof Zdbo ? Optional.of((Zdbo)dbo) : Optional.empty();
}

public static void method_A(Dbo dbo) {
    getSome(dbo).forEach(z -> z.setFieldX(dbo.getFieldX()));
}

public static void method_B(Dbo dbo) {
    getSome(dbo).forEach(z -> z.setFieldZ(dbo.getFieldZ()));
}

我会将其保留在“流”或“可选”级别。上面的method_A和method_B可以简单地替换为它们的内容,而不需要传递setter和getter。 而且它更通用,并且不会产生代码开销。

请注意,对于instanceof+cast,下一个java可能有更好的解决方案。

关于java - 怎样才能更好地抽象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64660708/

相关文章:

c - 开源三角方程简化器(最好是基于 C 的)?

java - 如何像在 Spring 中那样在 Dagger 中注入(inject)列表或集合?

java - 为什么在AQS(AbstractQueuedSynchronizer)的await方法中使用 "while"

java - java中如何判断谁将文件上传到ftp?

Java 8 流 : difference between limit() and skip()

php - 如何简化我的国家选择菜单 PHP/mysql

javascript - 这种逆向工程算法是如何工作的?

java - 实例化 java 泛型类,其构造函数采用类对象参数

java - 在由 Stream 外部的对象确定的流上返回 min

java - 如何使用流和 1.8 函数连接 2 个列表?