当前位置: 首页 > 知识库问答 >
问题:

如何使用布尔函数?Kotlin中if语句的返回类型

越望
2023-03-14

我正在使用返回true false的方法(例如方法containsKey of MutableList)。由于函数是用java写的,Kotlin把返回类型称为Boolean?这就是我得到一个编译错误的原因:“必需:布尔,发现:布尔?”.我必须说在某些情况下(不知道为什么)使用这个方法是可以的,有时它会返回上面的错误。有人能猜到是什么原因吗?

我的代码:

val gamesPerCountriesMap = mutableMapOf<String,MutableMap<Long, List<AllScoresGameObj>>>()

if (countryName != null  && countryName != "" && !gamesPerCountriesMap.containsKey(countryName))
{
    gamesPerCountriesMap.put(countryName, mutableMapOf<Long,List<AllScoresGameObj>>())
}

if (!gamesPerCountriesMap.get(countryName)?.containsKey(competitionId))
{
    gamesPerCountriesMap.get(countryName)?.put(competitionId, listOf<AllScoresGameObj>())
}

如果编译了第一个,则第二个会出错:

布尔类型的可空接收器上只允许安全(?.)或非空断言(!!.)调用?

如果我拿掉!在第二个假设的开始,我会出现不同的错误:

类型不匹配:推断的类型是布尔型?但布尔是意料之中的

读完所有的建议后,我写了下面的代码:

gamesPerCountriesMap.get(countryName)?.let {
    if (!gamesPerCountriesMap.containsKey(it))
    {
        gamesPerCountriesMap.get(countryName)?.put(competitionId, listOf<AllScoresGameObj>())
    }
}

你觉得怎么样?

共有3个答案

高胜
2023-03-14
if (!gamesPerCountriesMap.get(countryName)?.containsKey(competitionId))

将检查该项目是真、假还是空。“if”语句要求真或假。这就是为什么您会看到“类型不匹配:推断类型是布尔值?但布尔值是意料之中的”

if (gamesPerCountriesMap.get(countryName) == null || !gamesPerCountriesMap.get(countryName)!!.containsKey(competitionId))

如果项目为空,或者如果不为空但也不包含competitionID,那么这样做,这就是您想要使用的。

编辑:

您还希望允许地图包含如下空值:

val gamesPerCountriesMap = mutableMapOf<String,MutableMap<Long, List<AllScoresGameObj>>?>()

末尾的 “?” 允许嵌套的可变映射为空。

苗阳文
2023-03-14

基本上在Java中,布尔值是一种对象类型。它有 3 个可能的值:真、假和空。由于 kotlin 具有空安全功能,因此在对象类型中使用 ?,如布尔值,这就是为什么它要求您确保数据不为空。因此,对于您的代码:

 if (!gamesPerCountriesMap.get(countryName)?.containsKey(competitionId))
                        {
                            gamesPerCountriesMap.get(countryName)?.put(competitionId, listOf<AllScoresGameObj>())
                        }

它检查<code>get</code>方法是否返回null,如果不是,则继续执行下一个函数<code>containsKey</code>。如果它为空,那么它将传递If语句。对于非空断言,它强制使用<code>布尔值数据类型转换为布尔。如果您确定数据不能为空,这可以使用,否则它会破坏您的程序,因为您正在访问空数据中的函数。所以这取决于您的选择,您可以使用<code>吗或如果你确定它不是空的。

聂奇
2023-03-14

你必须处理可空的

mutableMapOf<String?, MutableMap...

这意味着键可以是空字符串

如果国家名称是一个字段,则

countryName?.let {
   //your validation here
}

字段可以更改,所以编译器不知道它是否可以为空。

val safeName = countryName ?: return
 类似资料:
  • 有人能用简单的英语解释一下这句话背后的逻辑吗? 假设mContainsLoadingRow为布尔值,如果< code>mContainsLoadingRow为< code>true, 然后返回< code > getContentDataSize()1 。 如果没有,则返回 这是正确的看待方式吗?

  • 今天我得到了一个关于代码的评论,考虑到我在学校作业中检查变量是真还是假的方式。 我编写的代码如下所示: 他们说这样写更好/更整洁: 例如,0和1不应该在该变量中。

  • 是否可以编写如下JPQL查询: <代码>选择计数(*) 这将根据实体填充条件是否存在返回真/假布尔值? 我想这样使用查询: 我示例中的查询在语法上不正确(解析错误),但是是否有任何正确的方法可以像在JPQL中那样进行检查,从而返回布尔值,或者只有在Java代码中才有可能?

  • 因此,在Java中,您可以调用一些在上返回的方法,例如,。我想在ftl文件中使用它,但由于某种原因这不起作用。 我对ftl很陌生,我今天才开始学习,但是,为什么这不管用呢?在java中,如果语句接受布尔值,则startsWith方法返回布尔值,那么这里的问题是什么? 错误为:

  • 我正在使用MyBatis调用PL SQL数据库中的一个函数。该函数中有一个OUT参数为布尔值,如下所示: 我的问题是,当我试图从xml映射器调用函数时,每次尝试mybatis都不能识别布尔输出,并抛出me和错误,就像不兼容的类型一样。另外,当我试图从PLSQL Developer测试该函数时,它会进行如下转换并以位形式返回布尔值。 忽略这个整数并指定MyBatis将输出视为布尔值是正确的?我怎么能

  • 问题内容: 我在从golang的if语句中返回函数的预期return语句时遇到麻烦。 我提供了以下代码: 主函数是否应该打印出随机函数返回的字符串值?我得到的是 有人知道如何实现这一目标吗? 问题答案: 即使该函数从未返回值,您也必须在末尾添加一个: http://play.golang.org/p/XFsPL2G15R