| 著作一覧 |
nullチェックの煩雑さを解決、Java SE 8で導入されたjava.util.Optionalクラス (3/9)を読んでいて、それなりに便利そうだな、と思った。
作ってみたら、簡単だった。Nullableがあるからだ。
using System;
static class OptionalT
{
static T OrElse<T>(this T n, T def)
{
return n != null ? n : def;
// なぜか return n ?? def; と書けないんだけど型パラメータ使うとそういうものだったっけ?
}
static T OrElseGet<T>(this T n, Func<T> def)
{
return n != null ? n : def();
}
static T Filter<T>(this T n, Func<T, bool> def)
{
return (n == null || !def(n)) ? default(T) : n;
}
static T FlatMap<T>(this T n, Func<T, T> def)
{
return (n == null) ? n : def(n);
}
static void IfPresent<T>(this T n, Action<T> def)
{
if (n != null) def(n);
}
static void Main()
{
int? val1 = 32;
int? val2 = null;
Console.WriteLine(val1.OrElse(4)); // => 32
Console.WriteLine(val2.OrElse(4)); // => 4
Console.WriteLine(val2.OrElseGet(() => 58)); // => 58
string x = null;
Console.WriteLine(x.OrElse("hello")); // => hello
Console.WriteLine("world".OrElse("hello")); // => world
Console.WriteLine(val1.Filter(n => n % 2 == 0).OrElse(4)); // => 32
Console.WriteLine(val2.Filter(n => n % 2 == 0).OrElse(4)); // => 4
Console.WriteLine(x.Filter(t => t.StartsWith("A")).OrElse("X")); // => X
Console.WriteLine("AB".Filter(t => t.StartsWith("A")).OrElse("X")); // => AB
x.FlatMap(f => x.FlatMap(l => $"{f} {l}")).OrElse("anonymous").IfPresent(name => Console.WriteLine(name)); // => anonymous
"x".FlatMap(f => "y".FlatMap(l => $"{f} {l}")).IfPresent(name => Console.WriteLine(name)); // => x y
}
}
ジェズイットを見習え |