著作一覧 |
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 } }
ジェズイットを見習え |