【问题标题】:Java Possible to Return Either Float or Integer?Java 可以返回浮点数还是整数?
【发布时间】:2014-02-19 07:04:03
【问题描述】:

是否可以有一个返回整数或浮点数的函数?如果可能的话,我想让这两个功能合二为一:

private static Integer parseStringFormatInt(String val){
    System.out.println(Integer.parseInt(val.substring(0, val.indexOf("."))));
    return Integer.parseInt(val.substring(0, val.indexOf(".")));
}
private static Float parseStringFormatFloat(String val){
    System.out.println(Float.parseFloat(val.substring(0, val.indexOf("."))));
    return Float.parseFloat(val.substring(0, val.indexOf(".")));
}

【问题讨论】:

  • 为什么?如果您只在小数点前转换,为什么需要浮点数?
  • 这是因为它从一个 Excel 文件中读取,该文件为 Integer 和 Float 输出“0.0”。
  • 那么为什么您认为需要将两段代码合二为一呢?
  • 注意 Excel 文件中没有整数或浮点数。有小数,有零个或多个小数位。

标签: java function numbers integer


【解决方案1】:

或者,返回一个可区分的联合,例如Either<Integer, Float>。在一个小型库中,有一个针对 Java 8 的独立实现,“矛盾”:http://github.com/poetix/ambivalence

Either<Integer, Float> either1 = Either.ofLeft(23);
Either<Integer, Float> either2 = Either.ofRight(Float.valueOf("3.14"));
BigDecimal result1 = either1.join(BigDecimal::valueOf, BigDecimal::valueOf);
BigDecimal result2 = either2.join(BigDecimal::valueOf, BigDecimal::valueOf);

您可以从 Maven 中心获取它:

<dependency>
    <groupId>com.codepoetics</groupId>
    <artifactId>ambivalence</artifactId>
    <version>0.2</version>
</dependency>

【讨论】:

    【解决方案2】:

    我不会。我会让方法返回“float”,带有一个小的“f”,或者更可能是“double”;我会让它解析整个值而不需要任何子字符串操作;我会在需要它的呼叫站点将值转换为“int”,和/或从那里转换为 Integer、Float、Double ......无论您在呼叫站点需要什么。 p>

    您会发现这比您接受的答案效率高出几个数量级,这只是一个穷人自我实现的运行时多态性,而您之前有编译时多态性。

    但问题本身是非常可疑的。 Excel 文件中没有整数和浮点数。只有小数位为零或多个小数位。

    【讨论】:

    • 返回 float 或 int 有很高的风险让您的 Java 返回 NullPointerException,这是我真正不想要的。这些数字将被保存到带有整数/浮点数的对象中。
    • 废话。返回 float、int、double 等有 zero 的 NullPointerException 风险。返回 Integer 或 Float 会带来这种风险,至少在理论上是这样。我真的很想知道你是否明白你在做什么。
    • 你懂Java吗?返回 Float/ Integer/ Double 则风险为零。这就是为什么当人们编写 POJO 时,大多数编码人员会编写 private Integer x OR private Float x 或 private Double x 而不是 private int x/ private float x/ private double x。四处打听。
    • 显然不知道“'float'和小'f'”之间的区别,这是我在这里推荐的,而不能null, 和 'Float',可以为 null。 NB 'private' 与它无关。问问自己。你在这里没有给任何人留下深刻印象。
    • 是的,我明白你的意思,但这就是我不建议自己在这里使用它的原因,因为 int/float 向我抛出了我不想在我的程序中出现的 nullpointerexception。这就是我所指的:stackoverflow.com/questions/2254435/…
    【解决方案3】:

    将返回类型设为Number,因为FloatInteger 都是Number 的子类型,如下所示

    private static Number parseStringFormatNumber(String val){
        //Based on your conditions return either Float or Integer values
    }
    

    你也可以让instanceof算子对返回值做测试,得到返回值的准确类型。即FloatInteger

    if(returnedValue instanceof Float)
    {
    // type cast the returned Float value and make use of it
    }
    else if(returnedValue instanceof Integer)
    {
    // type cast the returned Integer value and make use of it
    }
    

    【讨论】:

      【解决方案4】:

      你可以回Number:

      private static Number parseStringFormatNumber(String val){
          try {
              return Integer.valueOf(val.substring(0, val.indexOf(".")));
          } catch (NumberFormatException e) {
              try {
                  return Float.valueOf(val.substring(0, val.indexOf(".")));
              } catch (NumberFormatException e2) {
                  // handle invalid value (throw exception, return 0?)
              }
          }
      }
      

      【讨论】:

      • 但这会给我一个错误:构造函数 *ObjectName*(Project, String, String, String, Date, Date, String, String, String, String, boolean, boolean, String, Number, Number, Number) 未定义,但我想要 *ObjectName*(Project, String, String, String, Date, Date, String, String, String, String, boolean, boolean, String, Float, Integer, Integer)。
      • @progricebowl 您还必须修改该构造函数以使用数字。
      • 很难看出 NumberFormatException 是如何出现的。
      • 不,我不打算更改为 Number,因为这是我必须遵循的规则 - 我必须分别使用 Float 和 Integer。
      • @EJP 如果无法解析字符串,所有数字解析方法都会抛出 NumberFormatExceptions。
      【解决方案5】:

      您可以使用 Number 作为返回类型,或将方法设为通用

      static <T extends Number> T parseString(String str, Class<T> cls) {
          if (cls == Float.class) {
              return (T) Float.valueOf(str);
          } else if (cls == Integer.class) {
              return (T) Integer.valueOf(str);
          }
          throw new IllegalArgumentException();
      }
      

      【讨论】:

      • 谢谢,我会选择你的作为答案。 :D
      • 为什么?它的效率比你现在的要低得多。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 2021-05-14
      • 2012-08-19
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      • 2014-10-01
      相关资源
      最近更新 更多