Java:将原始布尔值转换为原始 int (0,1) 的好方法

Posted

技术标签:

【中文标题】Java:将原始布尔值转换为原始 int (0,1) 的好方法【英文标题】:Java: nice way to convert primitive boolean into primitive int (0,1) 【发布时间】:2014-10-20 05:56:39 【问题描述】:

我知道这应该很简单,但是...

我有 primitive java boolean。 相信这么简单的事情应该不需要额外的方法编码。 我非常不喜欢三元运算符和内联条件(? 对于那些想要声誉并试图回答任何问题的人,即使没有阅读问题)。所以(value ? 1 : 0) 不适合我。 我不能使用像value.compareTo(false) 这样的漂亮片段,因为它是primitive

我想得到的是类似于最后一点的东西,但对于原语。 惊讶没有好方法来做这样一个简单有用的转换?我也是。你的谷歌比我的大吗? ;-D

更新:

好的,最后我决定为这种情况编写自己的方法,因为不仅有类型转换,还有一些将来可以扩展的逻辑,我希望将它封装起来。感谢所有参与的人。

【问题讨论】:

为什么你不喜欢三元运算符? 与三元有关的问题很多。对我来说,我的所有分析人员都不喜欢它并过度增加代码复杂度指标就足够了。 @RomanNikitchenko 只不过是一个 if 语句,你不也使用这些吗? 您使用的是哪个分析工具? 这个怎么样? ***.com/a/3793669/1687499 【参考方案1】:

如果你不能严格使用value.compareTo(false),因为它是原始的,那么如何

Boolean.valueOf(value).compareTo(Boolean.FALSE);

【讨论】:

虽然值得注意的是,Oracle JDK 对这种方法的实现使用了三元运算符。 总比没有好 启动看起来太长了。没有缩短标准的方式吗? 是的。这是int i = value ? 1 : 0; @Roman 我还应该指出,compareTo 在 Oracle 实现中也使用了三元运算符。【参考方案2】:

这个呢?

boolean x = true;

System.out.println(Boolean.compare(x, false));

路号2

System.out.println(5 - Boolean.toString(x).length());

路数3(更长):

boolean x = true;

try
    System.out.println(Boolean.toString(x).charAt(4) - 101);
catch(StringIndexOutOfBoundsException e)
    System.out.println(1);

【讨论】:

你会发现这是用两个三元运算符实现的:return (x == y) ? 0 : (x ? 1 : -1);【参考方案3】:

没有什么好办法。额外的函数定义还不错。如果您讨厌三元,只需定义一个函数:

int bool_to_int(boolean mybool) 
    if (mybool)
        return 1;
    return 0;

【讨论】:

他们提到也不创建其他方法。 没有别的办法,只能用三元。至少这样看起来更干净。 当然有,三元运算符;没有方法调用就可以做到这一点。 我就是这么说的。但如果他讨厌三元,这看起来更干净。【参考方案4】:

使用三元运算符是做你想做的最简单、最有效、最易读的方法。我鼓励您使用此解决方案。

但是,我忍不住要提出一个替代的、人为的、低效的、不可读的解决方案。

int boolToInt(Boolean b) 
    return b.compareTo(false);

【讨论】:

这取决于Boolean.compareTo() 的实现——compareTo() 的规范只要求在大于或小于比较时返回正值或负值。将来理论上这可能会返回任何东西> 0【参考方案5】:

好的,最后这是我发现的最好的东西:

public class Main 

    public static int resultCode(final boolean flag) 
        return Boolean.compare(flag, false);
    

    public static void main(final String[] args) 
        boolean v1 = false;
        boolean v2 = true;
        System.out.println(v1 + " > " + resultCode(v1));
        System.out.println(v2 + " > " + resultCode(v2));
    

【讨论】:

【参考方案6】:

这里有一些关于你的方法的想法 - 它们都很令人兴奋,因为它们比 b ? 1: 0 复杂得多。

int bi1(boolean b) 
    // The number of items in a set containing both false and the value
    Set<Boolean> s = new HashSet<Boolean>();
    s.add(b);
    s.add(false);
    return s.size() - 1;


int bi2(boolean b) 
    // Side-effect usage.
    int bi = 0;
    boolean x = (b && (bi = 1) == 0);
    return bi;


int bi3(boolean b) 
    // Using Compareto in a gratuitously obscure way.
    return (int) Math.signum(("" + b).compareTo(Boolean.FALSE.toString()));


int bi4(boolean b) 
    // A twiddle too far.
    return ((int) ("" + !b).charAt(0)) >> 1 & 1;


int bi5(boolean b) 
    // The old if heave
    if (b) 
        return 1;
     else 
        return 0;
    


static final List<Boolean> ltf = Arrays.asList(false, true);

int bi6(boolean b) 
    // List twiddling.
    return ltf.indexOf(b);

你还想要多少?

【讨论】:

以上是关于Java:将原始布尔值转换为原始 int (0,1) 的好方法的主要内容,如果未能解决你的问题,请参考以下文章

将 0 和 1 (float64) 转换为布尔值时将空值转换为 True [重复]

为啥没有定义 Java 的布尔原始大小?

为啥没有定义 Java 的布尔原始大小?

如何将Object转换为布尔值?

将布尔对象数组转换为布尔原始数组? [复制]

javascript中的数据类型转换