java中布尔值做比较_Java中的三态布尔值

java中布尔值做比较

我不时地错过Java中SQL的三值BOOLEAN语义。 在SQL中,我们有:

  • TRUE
  • FALSE
  • UNKNOWN (也称为NULL

时不时地,我希望自己也可以用Java表达这种UNKNOWNUNINITIALISED语义,而普通的truefalse还不够。

实现一个ResultSetIterator

例如,当为jOOλ实现ResultSetIterator时,一个为Java 8建模SQL流的简单库:

SQL.stream(stmt, Unchecked.function(r ->new SQLGoodies.Schema(r.getString("FIELD_1"),r.getBoolean("FIELD_2"))
))
.forEach(System.out::println);

为了实现Java 8 Stream ,我们需要构造一个Iterator ,然后可以将其传递给新的Spliterators.spliteratorUnknownSize()方法:

StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, 0), false
);

在Stack Overflow上可以看到另一个示例 。

在实现Iterator接口时,我们必须实现hasNext()next() 。 请注意,在Java 8中, remove()现在具有默认实现,因此我们不再需要实现它。

尽管在大多数情况下,对next()的调用之前仅是对hasNext()的调用,但是Iterator协定中对此没有要求。 完全可以这样写:

if (it.hasNext()) {// Some stuff// Double-check again to be sureif (it.hasNext() && it.hasNext()) {// Yes, we're paranoidif (it.hasNext())it.next();}
}

如何将Iterator调用转换为JDBC ResultSet上的支持调用? 我们需要调用ResultSet.next()

我们可以进行以下翻译:

  • Iterator.hasNext() == !ResultSet.isLast()
  • Iterator.next() == ResultSet.next()

但是那个翻译是:

  • 昂贵
  • 没有正确处理空的ResultSet
  • 并非在所有JDBC驱动程序中都实现(对于结果集类型为TYPE_FORWARD_ONLY的ResultSet,对isLast方法的支持是可选的)

因此,我们必须在内部维护一个标志,该标志告诉我们:

  • 如果我们已经调用了ResultSet.next()
  • 那个电话的结果是

与其创建第二个变量,不如仅使用三值java.lang.Boolean 。 这是jOOλ的可能实现 :

class ResultSetIterator<T> implements Iterator<T> {final Supplier<? extends ResultSet>  supplier;final Function<ResultSet, T>         rowFunction;final Consumer<? super SQLException> translator;/*** Whether the underlying {@link ResultSet} has* a next row. This boolean has three states:* <ul>* <li>null:  it's not known whether there *            is a next row</li>* <li>true:  there is a next row, and it*            has been pre-fetched</li>* <li>false: there aren't any next rows</li>* </ul>*/Boolean hasNext;ResultSet rs;ResultSetIterator(Supplier<? extends ResultSet> supplier, Function<ResultSet, T> rowFunction, Consumer<? super SQLException> translator) {this.supplier = supplier;this.rowFunction = rowFunction;this.translator = translator;}private ResultSet rs() {return (rs == null) ? (rs = supplier.get()) :  rs;}@Overridepublic boolean hasNext() {try {if (hasNext == null) {hasNext = rs().next();}return hasNext;}catch (SQLException e) {translator.accept(e);throw new IllegalStateException(e);}}@Overridepublic T next() {try {if (hasNext == null) {rs().next();}return rowFunction.apply(rs());}catch (SQLException e) {translator.accept(e);throw new IllegalStateException(e);}finally {hasNext = null;}}
}

如您所见, hasNext()方法仅在之前为null本地缓存hasNext三值布尔状态。 这意味着多次调用hasNext() 直到调用next() ,这将重置hasNext缓存状态。

如果需要, hasNext()next()前进ResultSet光标。

可读性?

你们中有些人可能会认为这不利于可读性。 他们将引入一个新变量,例如:

boolean hasNext;
boolean hasHasNextBeenCalled;

麻烦在于,您仍在实现三值布尔状态,但分配给两个变量,很难以一种比实际java.lang.Boolean解决方案更易读的方式来命名它们。 此外,两个boolean变量实际上有四个状态值,因此,发生错误的风险会略有增加。

每个规则都有其例外。 自从引入Option / Optional以来一直存在的null -is-bad准则,对上述语义使用null是一个很好的例外。

换句话说:哪种方法最好? 没有TRUEFALSE答案,只有UNKNOWN

小心一点

但是,正如我们在之前的博客文章中所讨论的那样 ,如果可能的话,应该避免从API方法返回null 。 在这种情况下,显式使用null作为对状态建模的一种方法很好,因为此模型封装在我们的ResultSetIterator 。 但是,请避免将这种状态泄漏到API外部。

翻译自: https://www.javacodegeeks.com/2014/05/three-state-booleans-in-java.html

java中布尔值做比较

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/341635.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring Bean范围

介绍&#xff1a; Spring核心容器实例化bean并管理其生命周期。 在定义bean时&#xff0c;我们可以提供其范围。 除非明确提供&#xff0c;否则单例是Spring容器中Bean的默认范围。 Spring提供了五种类型的bean作用域。 在本教程中&#xff0c;我们将探讨它们中的每一个。 1.…

协议转换器指示灯的含义

很多对协议转换器了解不是很深的朋友&#xff0c;对协议转换器上面的各个指示灯可能会区分不清&#xff0c;很多情况下会搞不清各个指示灯的含义&#xff0c;接下来杭州飞畅科技的小编就来带大家详细了解下协议转换器上各个指示灯的含义&#xff0c;一起来看看吧&#xff01; …

V.35协议转换器指示灯告警常见故障以及排除方法解析

我们在使用协议转换器的时候&#xff0c;可能常常会遇到一些故障问题&#xff0c;这个可能会困扰到很多朋友&#xff0c;在这里&#xff0c;杭州飞畅的小编专门整理了V.35系列协议转换器在使用过程中的一些常见的故障问题及解决方法&#xff0c;感兴趣的朋友可以一起来看看吧&a…

飞畅科技V.35协议转换器指示灯告警说明详细介绍

飞畅V.35系列协议转换器实现了E1接口与V.35接口之间的相互转换&#xff0c;是杭州飞畅科技推出的又一款广泛使用、备受好评的设备。此转换器的E1接口支持成帧和透明两种模式&#xff0c;广泛应用于计算机网络互连、DDN数据网接入、移动电话网的传输优化和基于E1的PCM网络的各种…

计算机图形学论文_论图计算

计算机图形学论文自从机械计算开始以来&#xff0c;图形概念就已经存在&#xff0c;并且在纯数学领域已经存在了数十年。 由于数据库的黄金时代&#xff0c;图形在软件工程中变得越来越流行。 图形数据库提供了一种持久化和处理图形数据的方法。 但是&#xff0c;图形数据库并不…

2M线路保护实现与应用

由于传输电路是出于最底层的物理传送平面&#xff0c;目前这些传输电路调度工作仍然停留在手工调度&#xff0c;即耗费大量的人力物力&#xff0c;又花费大量的宝贵时间&#xff0c;尤其在紧急故障发生的时候&#xff0c;严重影响故障的抢修速度&#xff0c;从而影响通信网络恢…

只能在测试中注射吗?

本文是关于测试设计和可测试性的一些想法。 我们与我的儿子讨论了一些问题&#xff0c;他的儿子是Java的初级开发人员&#xff0c;目前在匈牙利的EPAM&#xff08;我工作的同一家公司&#xff0c;但在另一家子公司&#xff09;工作和学习。 本文中的所有内容都是不错的旧知识&a…

E1倒换保护设备知识详解

E1倒换是一款针对于国内重要部门而开发的保护设备&#xff0c;针对某些重要用户要求&#xff0c;E1倒换设备除了可以满足主、备两个传输路由间无损伤自动切换外&#xff0c;还可以满足主、备用户设备间自动切换。那么&#xff0c;什么是E1倒换&#xff0c;E1倒换保护怎么分类&a…

E1 PCM复用设备常见故障及处理方法

目前国内PCM设备技术发展非常迅速&#xff0c;PCM设备在通信系统中也是使用最多最常用到的。但是不少用户在使用PCM设备时会遇到各种故障&#xff0c;那么&#xff0c;我们该如何解决呢&#xff1f;接下来就由飞畅科技的小编来为大家介绍下E1 PCM复用设备常见故障及处理方法。 …

jooq中record_在Spring中使用jOOQ:CRUD

jooq中recordjOOQ是一个库&#xff0c;可帮助我们重新控制SQL。 它可以从我们的数据库生成代码&#xff0c;并允许我们使用其流畅的API来构建类型安全的数据库查询。 本教程前面的部分向我们介绍了如何配置示例应用程序的应用程序上下文以及如何从数据库中生成代码。 现在&am…

E1 PCM复用设备作用

Pulse Code Modulation&#xff08;PCM&#xff09;&#xff0c;中文称脉码调制或PCM复用设备&#xff0c;PCM复用设备的目的就是使交换机之间一条中继线不是只传送一条电话信号。 PCM复用设备也就是将语音&#xff0c;数据信号复接成2M信号的设备&#xff0c;直白一点就是将如…

变色龙功能

在《神秘博士》中&#xff0c;卡梅利恩&#xff08;Kamelion&#xff09;角色是可以采取任何形式的机器人。 据称&#xff0c;他们使用的物理道具非常麻烦&#xff0c;只有其创建者才能理解&#xff0c;而该创建者并没有帮助纠正它。 因此&#xff0c;Chamelion功能... 考虑以…

E1常见问题介绍

1. E1与CE1是由谁控制&#xff0c;电信还是互连的两侧的用户设备&#xff1f;用户侧肯定要求支持他们,电信又是如何分别实现的&#xff1f; 答&#xff1a;首先由电信决定&#xff0c;电信可提供E1和CE1两种线路&#xff0c;但一般用户的E1线路都是CE1&#xff0c;除非你特别要…

MSTP多业务传输平台对设备接口的要求有哪些?

MSTP&#xff08;Multi-Service Transfer Platform&#xff09;&#xff08;基于SDH 的多业务传送平台&#xff09;是指基于SDH 平台同时实现TDM、ATM、以太网等业务的接入、处理和传送&#xff0c;提供统一网管的多业务节点。 MSTP的实现基础是充分利用SDH技术对传输业务数据…

jibx_Jibx Jersey2集成

jibxJersey2为Jackson和JAXB提供内置支持。 但是默认情况下不支持Jibx。 要将Jibx与Jersey2结合使用&#xff0c;我们将XML输入作为流&#xff0c;并在接收到请求之后&#xff0c;使用Jibx对其进行解析。 但是实际上&#xff0c;有更好的方法可以使用MessageBodyReader和Messag…

PCM复用设备的安装和使用注意事项

PCM设备在通信系统中的是一种很常用的设备&#xff0c;但是不少用户在购买了PCM设备后&#xff0c;都不懂怎么去安装使用PCM复用设备。下面&#xff0c;飞畅科技的小编来为大家详细介绍下PCM复用设备的安装和使用注意事项&#xff0c;一起来看看吧&#xff01; PCM复用设备的安…

PCM复用设备功能介绍

PCM设备功能主要分为四大部分&#xff1a;接入与复用、时隙交叉、2M线路保护、接口测试功能。接下来就由飞畅科技的小编来为大家详细介绍下PCM复用设备的功能&#xff0c;一起来看看吧&#xff01; PCM复用功能&#xff1a; 用户业务接入与复用是PCM设备最基本的功能&#xff…

对象和索引流

我本来要写一篇关于如何将流与每个元素的索引混合的文章&#xff0c;但是Baeldung上的人们已经很好地涵盖了这个主题 &#xff01; 鉴于我是他们编辑团队的一员&#xff0c;我为他们/我们感到自豪。 有趣的是&#xff0c;特别是Streams中的Java函数式编程如何使我们脱离了一些…

PCM复用设备主要传输什么业务?

PCM即脉冲编码调制&#xff0c;在通信系统中完成将语音信号数字化功能。PCM的实现主要包括三个步骤完成&#xff1a;抽样、量化、编码。分别完成时间上离散、幅度上离散、及量化信号的二进制表示。 1、 抽样&#xff1a;所谓抽样&#xff0c;就是对模拟信号进行周期性扫描&…

Pcm设备2M通道,E1的基础知识介绍

Pcm设备2M通道在业内常简述为E1&#xff0c;E1这个词在通信行业起着非常重要的作用&#xff0c;相信刚接触这个词的人必定会感到陌生。接下来就由飞畅科技的小编来为您详细的介绍一下E1的基础知识。 一、E1概述 E1是ITU-T制定并由欧洲邮政与电信协会&#xff08;CEPT&#xff…