Java 8是否缺少OptionalBoolean?

Mar*_*son 32 java monads boolean optional java-8

作为一种原始的版本Optional*,爪哇1.8提供OptionalInt,OptionalLongOptionalDouble.

但我找不到同等的OptionalBoolean班级.

是否有任何技术原因反对OptionalBoolean

* 一个Optional可以或可以不具有一个值的情况下,使用作为替代null.

Era*_*ran 12

这句话解释了原始流背后的考虑因素.我假设同样适用于原始的Optionals.简而言之,出于性能原因,创建了原始流(也可能是Optionals).他们没有为所有8种原始类型创建它们,以减少代码重复和界面污染.

lambda邮件列表中引用Brian Goetz的话:

更一般地说:拥有专门的原始流(例如,IntStream)背后的哲学充满了令人讨厌的权衡.一方面,它有很多丑陋的代码重复,界面污染等.另一方面,盒装操作上的任何类型的算术都很糟糕,并且没有减少过量的故事会很糟糕.所以我们处在一个艰难的角落,我们试图不让它变得更糟.

不让它变得更糟的技巧#1是:我们没有做所有八种原始类型.我们做的是int,long和double; 所有其他人都可以通过这些来模拟.可以说我们也可以摆脱int,但我们认为大多数Java开发人员都没有为此做好准备.是的,会有对Character的调用,答案是"坚持使用int".(每个专业化预计约为JRE足迹的100K.)

特技#2是:我们使用原始流来揭示在原始域中最好的事情(排序,减少)但不尝试复制你在盒装域中可以做的所有事情.例如,正如Aleksey指出的那样,没有IntStream.into().(如果有的话,下一个问题是"IntCollection在哪里?IntArrayList?IntConcurrentSkipListMap?"意图是许多流可以作为参考流开始并最终作为原始流,但反之亦然.那没关系,那就是减少了所需的转换次数(例如,int - > T没有map的重载,int的函数没有专门化 - > T等)

我应该提一下,我在这个问题的答案中找到了引用.


Maa*_*wes 5

boolean值经常被滥用作为参数.有效的Java第二版警告不要滥用布尔值.如果它们不是用于实际的布尔值true/false参数,它们通常会导致代码难以理解.相反,作家约书亚布洛赫试图说服人们使用双重价值enum:

首选参数的两元素enum类型boolean.它使您的代码更易于阅读和编写,尤其是在您使用支持自动完成的IDE时.此外,它还可以在以后轻松添加更多选项.

大多数OptionalBoolean实例可能会被错误地使用.这是不包括一个的好理由.但我不能说 - 只有甲骨文可以 - 如果这就是它不存在的原因.

  • 因此,Oracle的政策是否省略可能被滥用的语言功能?有点令人失望,虽然我并不特别关心缺少OptionalBoolean.机器语言的制造者也没有这样的政策 - 我们只有0而没有1. (3认同)
  • Page 190 - 笨蛋,我的书在工作:) (2认同)