给定表1,其中一列为"x",类型为String.我想创建表2,其中列为"y",它是"x"中给出的日期字符串的整数表示形式.
必不可少的是将null值保留在"y"列中.
表1(数据帧df1):
+----------+
| x|
+----------+
|2015-09-12|
|2015-09-13|
| null|
| null|
+----------+
root
|-- x: string (nullable = true)
Run Code Online (Sandbox Code Playgroud)
表2(数据帧df2):
+----------+--------+
| x| y|
+----------+--------+
| null| null|
| null| null|
|2015-09-12|20150912|
|2015-09-13|20150913|
+----------+--------+
root
|-- x: string (nullable = true)
|-- y: integer (nullable = true)
Run Code Online (Sandbox Code Playgroud)
用于将列"x"中的值转换为列"y"的用户定义函数(udf)为:
val extractDateAsInt = udf[Int, String] (
(d:String) => d.substring(0, 10)
.filterNot( "-".toSet)
.toInt )
Run Code Online (Sandbox Code Playgroud)
并且工作,处理空值是不可能的.
尽管如此,我可以做类似的事情
val extractDateAsIntWithNull = udf[Int, String] (
(d:String) =>
if (d != …Run Code Online (Sandbox Code Playgroud) scala nullable user-defined-functions apache-spark apache-spark-sql
我有一个清单:
List<int, SomeStruct>
Run Code Online (Sandbox Code Playgroud)
出于某种原因,它不允许我为其分配空值.如果我想没有关联的结构,我该怎么办?
鉴于以下内容,为什么会抛出InvalidCastException?我不明白为什么它应该在一个bug之外(这是在x86; x64与clrjit.dll中的0xC0000005崩溃).
class Program
{
static void Main(string[] args)
{
MyDouble? my = new MyDouble(1.0);
Boolean compare = my == 0.0;
}
struct MyDouble
{
Double? _value;
public MyDouble(Double value)
{
_value = value;
}
public static implicit operator Double(MyDouble value)
{
if (value._value.HasValue)
{
return value._value.Value;
}
throw new InvalidCastException("MyDouble value cannot convert to System.Double: no value present.");
}
}
}
Run Code Online (Sandbox Code Playgroud)
以下是为以下内容生成的CIL Main():
.method private hidebysig static void Main(string[] args) cil managed
{
.entrypoint
.maxstack 3
.locals init …Run Code Online (Sandbox Code Playgroud) 一种方式比另一种方式有性能优势吗?
还有其他理由选择其中一个吗?
我HashMap<Int, Int>在Kotlin中使用了一个,当我get退出它时,返回类型是Int?.
如何将其转换Int?为Int?
到目前为止,我已经尝试过使用Int?.toInt(),但这似乎正在回归Int?.
我正在编写Fibonacci函数,我的代码如下:
val fibMemo : Map<Int, Int> = HashMap<Int,Int>()
fun fibN(n:Int) : Int {
if (n == 0 || n == 1) return 1
if (fibMemo.containsKey(n))
// Error here: Type mismatch: inferred type is Int? but Int was expected
return fibMemo.get(n)?.toInt()
else {
val newNum : Int = fibN(n-1) + fibN(n-2)
fibMemo.put(n, newNum)
return newNum
}
}
Run Code Online (Sandbox Code Playgroud) 当从Kotlin调用非可空性注释的Java函数时,我们得到灵活类型的返回值,用感叹号表示,例如String!.
Kotlin默默地允许将这些灵活值分配给正常的非null类型,例如String,这可能在运行时导致NullPointerExceptions.
我更希望得到编译器警告或错误的此类分配.或者,将平台类型视为等效于可空类型(例如String?).
例如,使用此Java代码:
import android.os.SystemClock;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
public class NullTest {
private String maybe() {
if (SystemClock.elapsedRealtimeNanos() % 2 == 0) {
return null;
}
return "ok";
}
public String annotatedNothing() { return maybe(); }
@Nullable public String annotatedNullable() { return maybe(); }
@NonNull public String annotatedNonNull() { return "ok"; }
}
Run Code Online (Sandbox Code Playgroud)
...以及以下Kotlin代码,我想在两个新行上看到错误(请参阅注释):
fun testnulls() {
val obj = NullTest()
val nullExact: String = obj.annotatedNullable() // already gives an error
val …Run Code Online (Sandbox Code Playgroud) 如果我有这样的枚举
public enum Hungry
{
Somewhat,
Very,
CouldEatMySocks
}
Run Code Online (Sandbox Code Playgroud)
和这样的自定义属性
public class HungerAttribute : Attribute
{
public Hungry HungerLevel { get; set; }
public Hungry? NullableHungerLevel { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我可以做这个
[Hunger(HungerLevel = Hungry.CouldEatMySocks)]
public class Thing1
Run Code Online (Sandbox Code Playgroud)
但我不能这样做
[Hunger(NullableHungerLevel = Hungry.CouldEatMySocks)]
public class Thing2
Run Code Online (Sandbox Code Playgroud)
它会生成一个错误,指出"'NullableHungerLevel'不是有效的命名属性参数,因为它不是有效的属性参数类型".
为什么不允许这样做?据我所知,从根本上说它不在可接受的类型列表中.有效类型似乎是基元,枚举,字符串,类型和前面类型的一维数组.
这只是一个旧规则,当Nullable出现时没有得到更新?
强类型DataTable支持"可空"字段类型,但设计器不允许您将设置更改为任何值类型字段的"允许空值".(即:字符串类型允许为空,但int不允许).
解决方法是在您想要获取Myfield时调用IsMyFieldNull().如果在包含null的情况下访问MyField,则会抛出一个eception.
这是一个巨大的麻烦,除了在显示null时可能导致应用程序崩溃时导致许多运行时错误.多年来我一直向微软抱怨这一点,但是每个新版本的visual studio仍然不允许使用可空的值类型.
我的问题:任何人都知道可以用来解决这个主要缺点的花哨的扩展方法吗?
c# extension-methods nullable dataset strongly-typed-dataset
我只是在脚下射击,想知道是否有实际的理由让这种情况成为可能.
无论如何,这个问题可以留在未来的脚射手的方便.
假设我们在vb.net中有一个可以为null的值:
Dim i as Integer?
Run Code Online (Sandbox Code Playgroud)
我们希望根据条件为其分配值,并使用三元运算符,因为它非常简洁和东西:
i = If(condition(), Nothing, 42)
Run Code Online (Sandbox Code Playgroud)
也就是说,如果条件是true,则采用可空性,否则采用该值.
射击发生的时间点.没有明显的原因VB编译器决定,对于共同的基类型Nothing和Integer是Integer,在该点它默默地平移语句:
i = If(condition(), 0, 42)
Run Code Online (Sandbox Code Playgroud)
现在,如果您要在C#中执行此操作:
i = (condition()) ? null : 42;
Run Code Online (Sandbox Code Playgroud)
你会立即得到一个编译器错误,说<null>不能很好地混合int.这很棒,因为这次我采用C#方式,我的脚会更健康.为了编译,你必须明确地写:
i = (condition()) ? null : (int?)42;
Run Code Online (Sandbox Code Playgroud)
现在,您可以在VB中执行相同操作并获得正确的null-ness:
i = If(condition(), Nothing, CType(42, Integer?))
Run Code Online (Sandbox Code Playgroud)
但这需要首先拍摄你的脚.没有编译器错误,也没有警告.这是Explicit On和Strict On.
所以我的问题是,为什么?
我应该把它当作编译器错误吗?
或者有人可以解释为什么编译器会以这种方式运行?
我想知道为什么它Nullable<T>是一个值类型,如果它被设计为模仿引用类型的行为?我理解GC压力之类的东西,但我不相信 - 如果我们想要int表现得像参考,我们可能会对所有具有真实参考类型的后果感到满意.我没有理由Nullable<T>不仅仅是盒装版本的Tstruct.
作为价值类型:
null)Equals,没有真正的问题)Nullable<Nullable<T>>不制作Nullable<T>参考类型可以解决这个问题吗?
改写和更新:
我已经修改了我的理由列表,但我的一般问题仍然是开放的:
引用类型如何Nullable<T>比当前值类型实现更糟糕?这只是GC压力和"小的,不可改变的"规则吗?它对我来说仍然很奇怪......
nullable ×10
c# ×7
kotlin ×2
.net ×1
apache-spark ×1
attributes ×1
cil ×1
clr ×1
dataset ×1
java ×1
non-nullable ×1
scala ×1
struct ×1
vb.net ×1