检查Scala Tuple是否在Java中包含`null`

时间:2017-12-02 21:47:45

标签: java scala null tuples

我有一个Scala元组:

$data = [];

$brandResult = $db->query("SELECT id, name FROM tbl_brand");
while ($row = $brandResult->fetchObject()) {
    $row->product_names = [];
    $data[$row->id] = $row;
}

$productResult = $db->query("SELECT id, brand_id, p_name FROM tbl_products");
while ($row = $productResult->fetchObject()) {
    $data[$row->brand_id][$row->id] = $row->p_name;
}

我正在从Java访问。问题是在Java中,val myTuple: (Int, Int) = (null.asInstanceOf[Int], 1) 返回myTuple._1()而不是0,正如我解释Angular Config。无论值集如何,null都返回始终为null。因此,我不知道如何检查哪个是真正的价值:如何检查它是myTuple._1null还是其他任何值?

感谢。

1 个答案:

答案 0 :(得分:1)

问题是在Java世界中null不是int类型的有效值。在Scala世界,事情非常相似。如果你只是运行

println(null.asInstanceOf[Int])

你会得到

  

0

作为你的输出。此行为在Scala规范的6.3 The Null Value部分中指定。

因此,您无法在null中测试int,因为它不能在那里。在Java世界中,解决方法是java.lang.Integer类,它是int上的不可变对象包装并支持Autoboxing and Unboxing。因此,您可以尝试将元组指定为

val myTuple: (Integer, Integer) = (null, 1)

然而,在Scala世界中有一个更好的替代 - scala.Option。而且由于Java 8有类似的java.util.Optional。所以你真正想要的是像

val myScalaTuple: (Option[Int], Option[Int]) = (None, Some(1))
val myJavaTuple: (Optional[Int], Optional[Int]) = (Optional.empty[Int](), Optional.of(1))