GVKun编程网logo

java – Boolean对Concrete语法树的查询/表达式(java语法树分析)

12

在这篇文章中,我们将带领您了解java–Boolean对Concrete语法树的查询/表达式的全貌,包括java语法树分析的相关情况。同时,我们还将为您介绍有关Boolean的parseBoolean

在这篇文章中,我们将带领您了解java – Boolean对Concrete语法树的查询/表达式的全貌,包括java语法树分析的相关情况。同时,我们还将为您介绍有关Boolean的parseBoolean(s)、valueOf(s)和getBoolean(s)区别、Django Template语法中 OneToOne、ForeignKey 外键查询、GaussDB SQL 基础语法示例 - BOOLEAN 表达式、java.lang.Boolean到scala.Boolean问题的知识,以帮助您更好地理解这个主题。

本文目录一览:

java – Boolean对Concrete语法树的查询/表达式(java语法树分析)

java – Boolean对Concrete语法树的查询/表达式(java语法树分析)

我正在创建一个允许布尔表达式的搜索表单,例如:“foo AND bar”或“foo AND NOT bar”.

是否有PHP,Ruby或Java库可以将布尔表达式转换为具体的语法树?

(我可以编写自己的词法分析器/解析器,但我宁愿使用经过试验和测试的东西)

编辑:澄清一下,我不是解析心律失常的表达.它将用于解析允许布尔运算符的全文查询.

解决方法:

我推荐Treetop.这是一种为您的PEG生成解析器的小型语言(Parsing Expression Grammar).它比LALR语法更容易使用,并且比递归下降解析器更强大(即它可以做一些超过一个符号的前瞻).

虽然Treetop并不复杂,但开始时有一些简单的例子是有帮助的.你会在threedaymonk’s treetop examples找到它们.

Boolean的parseBoolean(s)、valueOf(s)和getBoolean(s)区别

Boolean的parseBoolean(s)、valueOf(s)和getBoolean(s)区别

在Java中,我们经常会将 String 类型的"true"或"false"转化为 boolean 类型的 truefalse ;除强制类型转化实现以外,Java还提供了 Boolean.parseBoolean(s)Boolean.valueOf(s)Boolean.getBoolean(s) 三个方法,这个两三个方法是一样的吗?可以做一个简单的测试:

public static void main(String[] args) {
    boolean b1 = Boolean.parseBoolean("true");
    System.out.println("b1=" + b1);//b1=true
    b1 = Boolean.parseBoolean("false");
    System.out.println("b1=" + b1);//b1=false

    boolean b2 = Boolean.valueOf("true");
    System.out.println("b2=" + b2);//b2=true
    b2 = Boolean.valueOf("false");
    System.out.println("b2=" + b2);//b2=false

    boolean b3 = Boolean.getBoolean("true");
    System.out.println("b3=" + b3);//b3=false
    b3 = Boolean.getBoolean("false");
    System.out.println("b3=" + b3);//b3=false
}

上面这个简单的测试,Boolean.parseBoolean(s)Boolean.valueOf(s) 结果都是预期的,但是 Boolean.getBoolean("true") 的结果有些意外,我最初以为这三个方法只是内部实现不一样,结果应该是一样的,看来之前的想法是错的,打开源码看一下:

  1. Boolean.parseBoolean(s) 的源码:
public static boolean parseBoolean(String s) {
  return toBoolean(s);
}
private static boolean toBoolean(String name) {
  return ((name != null) && name.equalsIgnoreCase("true"));
}

从源码不难看出,当传入不区分大小写的字符串"true"时,都能得到 true 的返回,当传入"true"之外的字符串或null时,都将返回false;根据源码可以确信,将 String 类型的"true"或"false"转化为 boolean 类型的 truefalse,用这个方法将是最佳的选择。

  1. Boolean.valueOf(s) 的源码:
 public static final Boolean TRUE = new Boolean(true);
 public static final Boolean FALSE = new Boolean(false);

 public static Boolean valueOf(String s) {
   return toBoolean(s) ? TRUE : FALSE;
 }
 private static boolean toBoolean(String name) {
   return ((name != null) && name.equalsIgnoreCase("true"));
 }

从源码可以看到,底层实现和 Boolean.parseBoolean(s) 是一样的,只是这个方法返回的是Boolean对象,是包装类型,如果要转化为boolean值的话会有一层自动拆箱的过程,只返回boolean类型值的情况下,用 Boolean.parseBoolean(s)会更好一些。

  1. Boolean.getBoolean(s) 的源码:
public static boolean getBoolean(String name) {
  boolean result = false;
  try {
    result = toBoolean(System.getProperty(name));
  } catch (IllegalArgumentException e) {
  } catch (NullPointerException e) {
  }
  return result;
}
private static boolean toBoolean(String name) {
  return ((name != null) && name.equalsIgnoreCase("true"));
}

从源码可以理解到,这个方法的设计应该是为了提供一个系统属性到boolean的映射,日常代码很少使用,在一些使用场景比较特殊的情况下才会用到;我尝试在项目中查找有没有使用的这个方法的地方,在 org.quartz.core.shouldRunUpdateCheck 中找到了这个方法的使用,quartz用这个方法实现了一个定时联网检测更新的功能(这个功能引申出了另外一个quartz使用中的问题,后续总结之后再把文章链接贴到这里)。

要正确使用 Boolean.getBoolean(s) 的方式应该是如下:

System.setProperty("key", "true");
System.out.println(Boolean.getBoolean("key"));

Django Template语法中 OneToOne、ForeignKey 外键查询

Django Template语法中 OneToOne、ForeignKey 外键查询

主表的Models的结构

class A(models.Model):
    username = models.CharField(max_length=32, verbose_name=''用户名称'')
    password = models.CharField(max_length=64, verbose_name=''密码'')

从表的Models的结构

class B(models.Model):
    name = models.CharField(max_length=30, verbose_name=''员工姓名'')
    number = models.CharField(max_length=30, unique=True, default=100101, verbose_name=''员工工号'')
    phone = models.CharField(max_length=11, blank=True, null=True, verbose_name=''电话'')
    a = models.OneToOneField(A,verbose_name=''用户'')

一、OneToOne

1、在Template中使用主表(A) 查询 从表(B)的内容

注意:在template中写 从表(B)的名称字母要小写,即使你的models中定义时使用的大小字母,也都要小写

# 通过主表查询子表内容,object_A为template中主表A的对象
{{ object_A.b.name }}   # 子表B中的name字段信息
{{ object_A.b.number }}   # 子表B中的number字段信息
{{ object_A.b.phone }}   # 子表B中的phone字段信息

2、在Template中使用主表(B) 查询 从表(A)的内容

# 通过子表查询主表内容
{{ object_B.a.username }} 
{{ object_B.a.password }} 

二、 ForeignKey 

表C 中字段ForeignKey 到A表

class C(models.Model):
    info = models.CharField(max_length=32, verbose_name=''信息'')
    user= models.ForeignKey(A, verbose_name=''用户'')

1、从C表查A表的内容(正向查找)

{{ object_C.a.username }}   # 表A中的username字段信息

2、从A表中查C表的内容(反向查找)

{{ object_A.c_set.info}}   # 表C中的info字段信息
{{ object_A.c_set.all}}   # 表C中的所有字段信息

 

GaussDB SQL 基础语法示例 - BOOLEAN 表达式

GaussDB SQL 基础语法示例 - BOOLEAN 表达式

【直播预告】程序员逆袭 CEO 分几步?

一、前言 SQL 是用于访问和处理数据库的标准计算机语言。GaussDB 支持的 SQL 标准(默认支持 SQL2、SQL3 和 SQL4 的主要特性)。

本系列将以《云数据库 GaussDB—SQL 参考》为主线进行介绍。

二、GaussDB SQL 中的 BOOLEAN 表达式介绍 1、概念 在 GaussDB 数据库中,BOOLEAN 表达式是一种很常见的表达式类型,它用于比较两个条件,来确定其是否为真或假。BOOLEAN 表达式可以用于条件判断或在循环语句中作为终止条件。其语法非常简单,只需要使用逻辑运算符对两个条件进行比较。GaussDB SQL 支持 AND、OR 等逻辑运算符,这些运算符可以将结果组合成更复杂的布尔表达式。

2、组成 运算符:比较运算符(如 =、<>、<、>、<=、>=)和逻辑运算符(如 AND、OR、NOT 等)。 操作数:用于比较的字段值或常量。 3、语法示例 如下截图是游标使用中的 SQL 部分,SQL 中涉及到 BOOLEA 表达式用于条件判断和循环语句部分,可参考:

1)条件判断,见红色方框

“v_salary>=20000”,在这个例子中,当 v_salary >= 20000 时,则执行 THEN 后面的 UPDATE 语句。

2)循环语句,见蓝色方框

“% NOTFOUND”,是游标的属性之一,用于控制程序流程或者了解程序的状态。当最近的 DML(数据操作语言)操作(如 INSERT,UPDATE,DELETE 等)没有影响任何行时,该属性为真。''EXIT WHEN c1% NOTFOUND;'' 就会执行。

三、在 GaussDB SQL 中的基础应用 使用布尔表达式可以根据特定条件对结果进行过滤,只返回满足条件的数据。以下是一些在 SELECT 列表中使用布尔表达式的示例。

1、示例 1,使用比较运算符 -- 根据工资是否大于 2w 判断其是否为高工资,返回 TRUE 或 FALSE

`SELECT *

           ,(salary > 20000) AS high_salary

FROM company;`

上述 SQL 示例中,我们从 company 表中选择 name、age、address、salary 和一个布尔表达式 (salary> 20000),该表达式用于判断员工的工资是否高收入。 结果集中的 high_salary 列将显示布尔值 TRUE 或 FALSE。

2、示例 2,使用逻辑运算符 -- 根据年龄是否在 18-60 之间,判断其是否为有效年龄,返回 TRUE 或 FALSE

SELECT *

          ,(age >= 18 AND age <= 60) AS valid_age

FROM company;

上述 SQL 示例中,我们从 company 表中选择 name、age、address、salary 和一个布尔表达式 (age>= 18 AND age <= 60),该表达式用于判断员工的年龄是否有效。 结果集中的 valid_age 列将显示布尔值 TRUE 或 FALSE。

3、示例 3,使用 IS NOT NULL 运算符 -- 判断地址是否为空,返回 TRUE 或 FALSE

SELECT *

         ,(address IS NOT NULL) AS null_address

FROM company;

上述 SQL 示例中,我们从 company 表中选择 name、age、address、salary 和一个布尔表达式 (address IS NOT NULL),该表达式用于判断员工的地址是否为空值。 结果集中的 null_address 列将显示布尔值 TRUE 或 FALSE。

4、示例 4,使用 like 模式匹配操作符 LIKE:判断字符串是否能匹配上 LIKE 后的模式字符串。如果字符串与提供的模式匹配,则 LIKE 表达式返回为真(NOT LIKE 表达式返回假),否则返回为假(NOT LIKE 表达式返回真)。

-- 判断地址是否是 CN,返回 TRUE 或 FALSE

SELECT *

          ,(address LIKE ''CN%'') AS c_address

FROM company;

上述 SQL 示例中,我们从 company 表中选择 name、age、address、salary 和一个布尔表达式 (address LIKE ''CN%''),该表达式用于判断员工的地址是否在 CN。 结果集中的 c_address 列将显示布尔值 TRUE 或 FALSE。

附:在 GaussDB SQL 中还有一个模式匹配操作符 SIMILAR TO。

描述:SIMILAR TO 操作符根据自己的模式是否匹配给定串而返回真或者假。他和 LIKE 非常类似,只不过他使用 SQL 标准定义的正则表达式理解模式。

四、小结 BOOLEAN 表达式在 SQL 中非常常用,它们允许开发人员构建逻辑语句,这些语句能够对表中的数据进行复杂的过滤和选择。通过使用布尔表达式,查询结果可以缩小到满足特定条件的行,或者可以根据这些条件对数据进行聚合和分组。

总之,布尔表达式可以帮助我们进行逻辑判断和循环控制,提高代码的可读性。 熟练掌握 BOOLEAN 表达式的使用,在 GaussDB SQL 等开发过程中非常重要。

—— 结束

java.lang.Boolean到scala.Boolean问题

java.lang.Boolean到scala.Boolean问题

georgii@gleontiev:~$ scalaWelcome to Scala version 2.8.1.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_24).Type in expressions to have them evaluated.Type :help for more information.scala> val jbool = java.lang.Boolean.TRUE    jbool: java.lang.Boolean = truescala> val sbool = true         sbool: Boolean = truescala> def sboolMethod(sbool: Boolean) = print("got scala.Boolean " + sbool)              sboolMethod: (sbool: Boolean)Unitscala> sboolMethod(sbool)got scala.Boolean truescala> sboolMethod(jbool)<console>:9: error: type mismatch; found   : java.lang.Boolean required: scala.Boolean       sboolMethod(jbool)                   ^scala> implicit def jbool2sbool(bool: java.lang.Boolean): scala.Boolean = bool.booleanValuejbool2sbool: (bool: java.lang.Boolean)Booleanscala> sboolMethod(jbool)                                                                  got scala.Boolean true

问题是:为什么没有默认的隐式转换从java.lang.Booleanscala.Boolean?这个问题也代表java.lang.Longvs
scala.Long和其他标准类型(尚未尝试所有标准类型)。

答案1

小编典典

在2.9中,进行了这种转换,以帮助与Java进行互操作。(Scala不需要单独使用它,因为它可以透明地对原语进行装箱和拆箱,这也许就是为什么它不包括在内的原因。)

今天关于java – Boolean对Concrete语法树的查询/表达式java语法树分析的介绍到此结束,谢谢您的阅读,有关Boolean的parseBoolean(s)、valueOf(s)和getBoolean(s)区别、Django Template语法中 OneToOne、ForeignKey 外键查询、GaussDB SQL 基础语法示例 - BOOLEAN 表达式、java.lang.Boolean到scala.Boolean问题等更多相关知识的信息可以在本站进行查询。

本文标签: