トップ «前の日記(2016-03-21) 最新 次の日記(2016-04-02)» 編集

日々の破片

著作一覧

2016-03-25

_ C#でOptional

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
    }
}

2003|06|07|08|09|10|11|12|
2004|01|02|03|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|

ジェズイットを見習え