Elvis Operator:概要、構文、null値の処理

著者: IT Sectr 公開日: 2026-05-27 読了時間: 8 分

Elvis Operatorは二項演算子で、左オペランドがnullでない場合は左を、nullの場合は右を返します。Kotlin、Groovy、その他の言語で?:と記述されます。Kotlin言語ドキュメント(2024年)によると、この演算子は言語のnull安全システムの一部であり、可読性を損なうことなく条件構文を1行に短縮できます。完全なif-else式とは異なり、Elvis Operatorは左辺がnullの場合にのみ右辺を評価するため、高コストなデフォルト式を使用する際にパフォーマンス上の利点があります。

重要ポイント

  • Elvis Operator — 2つのうち最初の非nullオペランドを返す?:演算子
  • Null safety — Kotlinおよび他の言語におけるElvis Operatorの主要な適用分野
  • 構文は非常に簡潔:val result = a ?: b、if (a != null) a else bと同等
  • Groovyは同じ?:構文を使用、Swiftは??演算子、Dartは??を使用
  • ロギングはElvis Operatorの人気パターン:val name = input ?: "default"

Elvis Operatorとは

Elvis Operatorはエルヴィス・プレスリーのヘアスタイルにちなんで名付けられた二項演算子です。?:の記号は横向きの歌手の顔を視覚的に連想させます:疑問符が目ともみあげ、コロンが口です。この演算子は2つのオペランドを取り、最初がnullでなければそれを返し、nullなら2番目を返します。これにより、完全なif-else構文を1つの短い式で置き換えることができます。

名称の由来

「Elvis Operator」という名前はKotlinGroovyのコミュニティで定着し、その後Xtendや他のJVM言語に広がりました。SwiftやDartでは類似の構文はnil-coalescing operatorと呼ばれますが、機能的には同じです。エルヴィス・プレスリーとの視覚的な関連性が、この演算子を現代のプログラミング言語の構文で最も認知された記号の1つにするのに役立ちました。

null処理における役割

Elvis OperatorはNullPointerException(NPE)を防ぐnull safetyシステムの一部です。JetBrainsの2023年の調査によると、NPEは本番JVMコードにおける全例外の28%を占めています。Elvis Operatorを使用すると、代入時点でNPEを完全に排除し、デフォルト値を保証します。安全呼び出し演算子?.と組み合わせることで、1つのifブロックもない信頼性の高いチェーンが作成されます。

KotlinにおけるElvis Operatorの構文

Kotlinでは、Elvis Operatorは2つの式の間に?:と記述します。左の式がnullでなければ結果は左の式と等しく、nullの場合は右の式が評価されます。右の式は遅延評価されます — 左オペランドがnullの場合のみ評価され、高コストな計算やAPI呼び出しを使用する際のパフォーマンスにとって重要です。

kotlin
val name: String? = getUserName()
val displayName = name ?: "Guest"

fun getLength(str: String?): Int {
    return str?.length ?: 0
}

val config: Config? = loadConfig()
val timeout = config?.timeout ?: 30
println("Timeout: $timeout")

// Elvis with throw(必須パラメータ用)
val requiredId = nullableId ?: throw IllegalArgumentException("ID is required")

// Elvis with return(早期復帰用)
fun process(data: String?): Result {
    val safe = data ?: return Result.failure("No data")
    return processInternal(safe)
}

letとの組み合わせはKotlinの一般的なパターンで、Elvis Operatorがデフォルト値を提供し、letが非null結果に対してアクションを実行します。このアプローチは、可読性を損なうことなく、if-elseブロック全体を1つの呼び出しチェーンで置き換えます。Elvis Operatorはthrowと共に使用して、必須パラメータがない場合に強制終了することもできます — これは入力データを検証する慣用的な方法です。

関数からの早期復帰を伴うElvis

KotlinではElvis + returnのパターンが一般的です。値がnullの場合、関数は即座に結果を返すか例外をスローします。Elvis with returnイディオムはデータ変換関数でよく使用されます:val processed = rawData ?: return defaultValue。これはSwiftのguard letよりもコンパクトで、コードのネストを増やしません。

Elvis Operator vs if-else:比較

Elvis Operatorはif-elseよりも短く、変数を繰り返す必要がありません。比較してください:val x = a ?: b 対 val x = if (a != null) a else b。複雑な式ではコード削減率が60%に達し、一方セマンティクスは完全に同一です — コンパイラは両方のバリアントに対して同じバイトコードを生成できます。

基準Elvis Operatorif-else
長さ1行、5~10文字3行、15~30文字
式の繰り返しなしあり (a != null) ? a : b
遅延評価の右辺はいはい(elvisの方が短い)
副作用右辺のみ両方の分岐で
可読性単純なケースでは高い複雑なロジックでは良好

Elvis Operatorを使うべき時

Elvis Operatorはデフォルト値の割り当て、安全なアクセスを伴う関数呼び出しの連鎖、欠損値のロギングに最適です。Kotlinの慣用的パターンは、式内の単純なnullチェックのためのif-elseの代替として推奨しています。?.と組み合わせると、一時変数なしでコンパクトなチェーンを生成します。

if-elseが望ましい時

if-elseは複数の条件がある場合、副作用を実行する必要がある場合、または両方のオペランドが複数の操作を含む複雑なコードブロックである場合に依然として望ましいです。Elvis Operatorはネストされたブロックをサポートしていません — 各オペランドに対して単一の式のみです。右辺が副作用のある関数を呼び出す場合、if-elseの可読性が高くなります。

他のプログラミング言語におけるElvis Operator

GroovyはKotlinとまったく同じ?:構文を使用します。両方の言語がJVM上で動作し、null安全の哲学を共有しているためです。この演算子はGroovyでより早く登場しました — 2011年にリリースされたバージョン1.8から言語に含まれています。GroovyはElvis代入もサポートしています:x ?= value(xがnullの場合のみ代入)。

groovy
def name = getUserName()
def display = name ?: "Guest"

def map = ["key": "value"]
def result = map?.get("missing") ?: "default"
println(result)

// GroovyでのElvis代入
def config = null
config ?= "defaultConfig"
assert config == "defaultConfig"

Swiftでは同等のものはnil-coalescing operatorと呼ばれ、??と記述されます。Dartでも同じ??構文が使用されます。違いは、SwiftとDartではオペランドの型が一致する必要があるのに対し、Kotlinは共通のスーパータイプへの自動変換で異なる型を許可することです。TypeScriptでは、??演算子(nullish coalescing)がバージョン3.7で登場し、nullとundefinedに対してのみ機能します(すべてのfalsy値をフィルタリングする||とは異なります)。PHPでは??演算子がバージョン7.0で、C#では??がバージョン6.0から登場しました。

Elvis Operatorのよくある間違い

最も一般的な間違いは、Elvis Operator ?:と安全呼び出し演算子?.を混同することです。Kotlinでは、?.はオブジェクトがnullでない場合のみメソッドやプロパティを呼び出し、?:はnullの場合にデフォルト値を返します。これらは順次組み合わせられますが、それぞれ独自の機能を果たします。混乱は、?.なしで?:を使用しようとする初心者の間で発生します。

右オペランドでの副作用

Elvisの右辺は遅延評価されますが、副作用のある関数呼び出しが含まれている場合、予期しない動作を引き起こす可能性があります。開発者は時々、高コストな計算やロギングを右辺に配置しますが、値が非nullの場合は実行されません。右辺は必要な場合にのみ評価される式であることを覚えておくことが重要です。

グループ化なしのElvis連鎖

複数のElvisを連続して使用すると、コードの読みやすさが低下する可能性があります。たとえば、a ?: b ?: c ?: dは左から右に評価され、最初の非nullを返します。グループ化を括弧で行うか、ロジックを別の関数に抽出すると、可読性が向上しデバッグが容易になります。チェーンが3要素を超える場合は、when式またはヘルパー関数を使用する必要があります。

ブール条件でのif-elseの代わりにElvis

初心者の開発者は時々、ブール値のチェックにElvis Operatorを使用しようとします:val x = flag ?: false。これはflagがnullになり得る場合にのみ機能します。nullなしのブール条件には、通常のif-elseまたは三項演算子が必要です — Kotlinには三項演算子はありませんが、if-else式で代用されます:val x = if (flag) a else b。

よくある質問

Elvis Operatorと三項演算子の違いは何ですか?

Elvis Operatorはnullのみをチェックしますが、三項演算子は任意のブール条件を受け入れます。Kotlinには三項演算子はありません — if-else式で代用されます。Elvisは1つの特定のタスク(null時のデフォルト値)を解決しますが、三項演算子はすべての条件式をカバーします。

Elvis Operatorを関数と共に使用できますか?
">

はい、右辺は関数呼び出しにできます:val x = a ?: calculateDefault()。遅延評価により、aがnullの場合のみ関数が評価されます。これにより、値が存在する場合のパフォーマンス低下なしに、高コストな計算、API呼び出し、データベースクエリを使用できます。

JavaにElvis Operatorは存在しますか?
">

Javaには直接のElvis Operatorはありません。Java 8以降では、Optional.ofNullable(value).orElse(default)を使用できます。Java 14+ではswitch式が導入されましたが、完全な?:はありません。KotlinとGroovyはそれを言語の組み込み構文として提供しています。

Elvis Operatorは呼び出しチェーンでどのように機能しますか?
">

典型的なパターンは安全呼び出し?.の後にElvisを続けることです。例:user?.address?.city ?: “Unknown”。チェーンのいずれかの要素がnullの場合、デフォルト値が返されます。これはネストされたifチェックのコンパクトな代替であり、従来のアプローチと比較してコードを3~5倍削減します。

Elvis OperatorとOptionalのorElseの違いは何ですか?
">

Elvis Operatorは言語レベルの構文構造であり、orElseはJavaのOptionalのメソッドです。Elvisは遅延評価(右辺はnullの場合のみ評価)ですが、orElseは常に引数を評価します。Javaで遅延バリアントを使用するには、Supplierを受け取るorElseGetがあります。Elvisの方が短く、Optionalを作成する必要がありません。

">

まとめ

  • Elvis Operator — オペランドがnullの場合にデフォルト値を提供する?:演算子
  • 構文 KotlinとGroovy:val result = a ?: b、bはa == nullの場合のみ評価
  • Null safety — NullPointerExceptionを防ぐ主要な適用分野
  • Nil-coalescing — Swift (??) や Dart (??) での同等機能、TypeScriptではバージョン3.7からの??
  • 組み合わせ 安全呼び出し?.と共に、ネストなしのコンパクトなnull処理チェーンを実現
  • 遅延評価 右オペランド — 三項演算子との主要な違い
  • ベストプラクティス — 単純なnullチェックに使用し、副作用のある複雑なブロックでは避ける

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください