DataWeave 関数の定義

DataWeave スクリプトのヘッダー内で ​fun​ 宣言を使用して、独自の DataWeave 関数を定義できます。 開始する前に、Mule 4 アプリケーションでは DataWeave のバージョン 2.x が使用されることに注意してください。Mule 3 アプリケーションでの DataWeave については、​DataWeave バージョン 1.2 のドキュメント​を参照してください。 他の Mule バージョンの場合は、DataWeave の目次のバージョンセレクターを使用できます。

DataWeave 関数定義の構文

DataWeave で関数を定義するには、次の構文を使用します。

fun myFunction(param1, param2, ...) = <code to execute>
  • fun​ キーワードは関数の定義を開始します。

  • myFunction​ は、関数に対して定義する名前です。

    関数名は有効な識別子である必要があります。有効な識別子についての詳細は、​「有効な識別子を宣言するためのルール」​を参照してください。

  • (param1, param2, …​ , paramn)​ は、関数で受け入れるパラメーターを表します。

    ゼロ個から任意の数までのパラメーターをカンマ (​,​) で区切り、括弧で囲んで指定できます。

  • =​ 記号は、関数がコールされたときに実行するコードブロックの先頭をマークします。

  • <code to execute>​ は、関数で定義する実際のコードを表します。

関数定義の例

次の例では、1 つの文字列引数を受け入れて、受け取った文字列引数を使用して ​upper​ 関数をコールし、結果を出力する DataWeave 関数を定義します。

例: 簡単な関数定義
%dw 2.0
output application/json
fun toUpper(aString) = upper(aString)
---
toUpper("hello")
出力
"HELLO"

次の例は、DataWeave 関数の引数で任意の DataWeave 式を使用する方法を示しています。

例: 引数としての式の使用
%dw 2.0
output application/json
fun toUpper(aString) = upper(aString)
---
toUpper("h" ++ "el" ++ lower("LO") )
出力
"HELLO"

次の例では、組み込みの ​match​ 操作を使用して​パターン一致​を実行し、関数に渡された引数の型をテストします。

例: パターン一致を使用する例
%dw 2.0
output application/json
fun toUpper(aString)
= aString match {
  case is String -> upper(aString)
  else -> null
}
---
toUpper("h" ++ "el" ++ lower("LO") )
出力
"HELLO"

次の例では、数値文字列を共通の電話番号形式に再度書式設定する関数を作成します。

例: toPhoneFormat() 関数
%dw 2.0
output application/json
fun toPhoneFormat(str: String) =
    "(" ++ str[0 to 2] ++ ") " ++ str[3 to 5] ++ "-" ++ str[6 to 9]
---
toPhoneFormat("1234567890")
出力
"(123) 456-7890"

型制約の定義

関数を宣言するときに型制約の式を定義すると、関数コールの引数に、定義した型制約を確実に適用できます。

関数の型制約を定義するには、次の構文を使用します。

fun myFunction(param1: Type, param2: Type): ResultType = <code to execute>
例: 型制約を使用する関数
%dw 2.0
output application/json
fun toUser(id: Number, userName: String): String = "you called the function toUser!"

この例の型制約では、関数 ​toUser​ が 1 番目の引数で ​Number​ 型のみを受け入れ、2 番目の引数で ​String​ 型のみを受け入れることを定義します。

また、この関数では、結果を ​String​ 型にする制約も指定されています。この戻り値の型制約は関数コールには影響しません。この制約を関数コードに適用して、関数で定義済みの型が生成されたことを検証します。

DataWeave 型システムについての詳細は、​https://docs.mulesoft.com/dataweave/latest/dataweave-type-system を参照してください。

省略可能なパラメーターの定義

デフォルト値をパラメーターに割り当てることで、省略可能なパラメーターを定義できます。次の例は、必須の 1 つのパラメーター (​name​) と、デフォルト値を持つ省略可能な 2 番目のパラメーター (​countryCode​) を定義している関数を示しています。

例: 省略可能なパラメーターを使用する関数
%dw 2.0
output application/json
fun createUserData(name, countryCode = "US") = { "User name" : name, "Location": countryCode}
---
[createUserData("Cristian", "AR"), createUserData("Max The Mule")]
出力
[
  {
    "User name": "Cristian",
    "Location": "AR"
  },
  {
    "User name": "Max The Mule",
    "Location": "US"
  }
]

省略可能なパラメーターの順序

DataWeave では、パラメーター定義の先頭または末尾で省略可能なパラメーターを定義できます。

例: 省略可能なパラメーターを使用する関数
%dw 2.0
output application/json
fun optionalParamsLast(a, b = 2, c = 3)
fun optionalParamsFirst(a = 1, b = 2, c)

関数をコールすると、引数は左から右へ割り当てられます。ただし、省略可能なパラメーターを最初に定義した場合、引数は右から左へ割り当てられます。また、関数のすべてのパラメーターが省略可能な場合も、割り当ては右から左です。

例: 省略可能なパラメーターの割り当て
%dw 2.0
output application/json
fun optionalParamsLast(param1, param2 = 2, param3 = 3) =
    { "param1": param1, "param2": param2, "param3": param3}
fun optionalParamsFirst(param1 = 1, param2 = 2, param3) =
    { "param1": param1, "param2": param2, "param3": param3}
fun allParametersOptional(param1 = 1, param2 = 2, param3 = 3) =
    { "param1": param1, "param2": param2, "param3": param3}
---
{
  "optionalParamsLast(A)":optionalParamsLast('A'),
  "optionalParamsLast(A, B)":optionalParamsLast('A', 'B'),
  "optionalParamsLast(A, B, C)":optionalParamsLast('A', 'B', 'C'),
  "optionalParamsFirst(A)":optionalParamsFirst('A'),
  "optionalParamsFirst(A, B)":optionalParamsFirst('A', 'B'),
  "optionalParamsFirst(A, B, C)":optionalParamsFirst('A', 'B', 'C'),
  "allParametersOptional(A)":allParametersOptional('A'),
  "allParametersOptional(A, B)":allParametersOptional('A', 'B'),
  "allParametersOptional(A, B, C)":allParametersOptional('A', 'B', 'C')
}
出力
{
  "optionalParamsLast(A)": {
    "param1": "A",
    "param2": 2,
    "param3": 3
  },
  "optionalParamsLast(A, B)": {
    "param1": "A",
    "param2": "B",
    "param3": 3
  },
  "optionalParamsLast(A, B, C)": {
    "param1": "A",
    "param2": "B",
    "param3": "C"
  },
  "optionalParamsFirst(A)": {
    "param1": 1,
    "param2": 2,
    "param3": "A"
  },
  "optionalParamsFirst(A, B)": {
    "param1": 1,
    "param2": "A",
    "param3": "B"
  },
  "optionalParamsFirst(A, B, C)": {
    "param1": "A",
    "param2": "B",
    "param3": "C"
  },
  "allParametersOptional(A)": {
    "param1": 1,
    "param2": 2,
    "param3": "A"
  },
  "allParametersOptional(A, B)": {
    "param1": 1,
    "param2": "A",
    "param3": "B"
  },
  "allParametersOptional(A, B, C)": {
    "param1": "A",
    "param2": "B",
    "param3": "C"
  }
}

型パラメーターの定義

DataWeave 関数定義では、一部のプログラミング言語の汎用型に似ている型パラメーターの使用がサポートされています。

例: 型パラメーターを使用する関数
%dw 2.0
output application/json

fun toArray<T>(x: T): Array<T> = [x]
---
toArray(2)

DataWeave では、関数で受け入れられる入力を制限する型パラメーター制約の追加もサポートされています。

例: 型パラメーターと制約を使用する関数
%dw 2.0
output application/json

fun getName<T <: { name: String }>(x: T): String = x.name
---
{
  name: getName({ name: "Andrés" })
  //name: getName({ age: 20 }) invalid call as the parameter does not fullfill the constraint
}

関数オーバーロード

DataWeave では、同じ名前でパラメーターの異なる複数の関数を作成できます。これは、関数コールの引数に基づいて異なる動作を定義するのに便利です。

オーバーロードされた関数のパラメーターは、数や型が異なります。関数パラメーターの型を定義する際の制約については、​「型システム」​を参照してください。

DataWeave は、スクリプトで関数が宣言されている順序に従って、関数コールの引数を受け入れる最初の関数を使用します。

例: 関数オーバーロードを使用する関数
%dw 2.0
output application/json

fun toUpper(a: String) = upper(a)
fun toUpper(a: Any) = null
fun toUpper(a: String, b: Number) = upper(a) ++ b as String
---
toUpper("hi!")

関数コール ​toUpper("hi!")​ の引数は、String (文字列) 型と Any (任意) 型に一致するため、最初の 2 つの定義で関数を呼び出すことができます。ただし、Any (任意) 型を使用する関数より先に ​fun toUpper(a: String) = upper(a)​ 関数が定義されているため、DataWeave はこの関数を実行します。

Output of toUpper("hi!")
"HI!"
Output of toUpper(true)
null
Output of toUpper("age: ", 26)
"AGE: 26"