Dartにはnullが有る

nullは使うべきじゃないし、そもそも言語としてnullすら無い!という風潮ですが、新しい言語であるDartにはnullが普通に有ります。
さらにnullが有るのにOptional系の便利なツールは標準では提供されていません。

その代わり、nullが有ってもある程度は安全に、楽にコードを書けるオペレータが用意されています。

expr1 ?? expr2 : expr1がnullじゃなければexprt1を返し、もしexpt1がnullならexpr2を返す
expr1 ??= expr2 : exprt1がnullなら、expr2をexpr1に代入する

main () {

    int v = null;
    assert (v == null);

    // vがnullなら0を返したい場合
    // コレは普通の三項演算子
    assert(0 == (v == null ? 0 : v));

    // 上記と等価な別の記法
    assert(0 == (v ?? 0));

    // 上記はともに「値を返す」だけなので、vはまだ相変わらずnullのまま
    assert(v == null);

    // nullなら別の値を入れて上書きする「??=」演算子がある
    v ??= 0;
    assert(v == 0);

    // vはもうnullじゃないので、以下の代入は働かない。
    v ??= 100;
    assert(v == 0);
}

obj?.hoge() : objがnullなら、メソッドを実行しない

main () {
    // メソッド呼び出しを`?.`とすることで、nullならそのメソッドが実行されなくなる。
    a = null;
    assert(null == a?.map((v) => v * 2)?.reduce((v1, v2) => v1 + v2));

    // nullじゃなければ普通に実行される。
    a = [1, 2, 3];
    assert(12 == a?.map((v) => v * 2)?.reduce((v1, v2) => v1 + v2));
}

そもそもOptional頂戴!という気持ちでは有りますが、無いものは無いので仕方ありません。
また個人的にもApache Groovyでずーっとコードを書いてきたので正直このDartのオペレータ自体には違和感はありませんでした。