importPackage(java.io);
importPackage(java.lang);
// ※これを、System.out.println だと思ってください。
function println(str) {
System.out.println(str)
}
// 変数に関数を値として代入する。
// こっちは変数に関数を定義して代入。Javaの ラムダ式 s -> System.out.println(s) と同じイメージ。
var printStr1 = function(s){println(s)}
// こっちは定義済みの関数を代入するイメージ。メソッド参照, System.out::println と同じイメージ。
var printStr2 = println
// printStr1, printStr2どちらも関数なので、`変数(引数)` の形式で関数の実行ができる。
// Javaだと、ConsumerやFunctionみたいなオブジェクトとして定義されるので、printStr.apply("hello")みたいにしないといけない。
printStr1("hello1")
printStr2("hello2")
// 関数を引数に取る関数の例
function myForEach(list, func) { // funcは、javaだと、Consumer<T>みたいに引数の数と戻り値の有無に応じたインターフェース型にする。
for(var i = 0; i<list.length;i++) {
func(list[i]) // javaなら、func.apply(list.get(i))
}
}
// 関数を代入した変数を渡すこともできるし.
myForEach([1,2,3], printStr1);
// ラムダ式(無名関数)を渡すこともできるし、
myForEach([4,5,6], function(i){println(i)}) // Javaなら、 i -> System.out.println(i)
// 関数の名前で、関数そのものを渡すこともできる
myForEach([7,8,9], println) // Javaなら、 System.out::println でメソッド参照と同じ。
aW1wb3J0UGFja2FnZShqYXZhLmlvKTsKaW1wb3J0UGFja2FnZShqYXZhLmxhbmcpOwoKLy8g4oC744GT44KM44KS44CBU3lzdGVtLm91dC5wcmludGxuIOOBoOOBqOaAneOBo+OBpuOBj+OBoOOBleOBhOOAggpmdW5jdGlvbiBwcmludGxuKHN0cikgewoJU3lzdGVtLm91dC5wcmludGxuKHN0cikJCn0KCi8vIOWkieaVsOOBq+mWouaVsOOCkuWApOOBqOOBl+OBpuS7o+WFpeOBmeOCi+OAggovLyAg44GT44Gj44Gh44Gv5aSJ5pWw44Gr6Zai5pWw44KS5a6a576p44GX44Gm5Luj5YWl44CCSmF2YeOBriDjg6njg6Djg4DlvI8gIHMgLT4gU3lzdGVtLm91dC5wcmludGxuKHMpIOOBqOWQjOOBmOOCpOODoeODvOOCuOOAggp2YXIgcHJpbnRTdHIxID0gZnVuY3Rpb24ocyl7cHJpbnRsbihzKX0KLy8g44GT44Gj44Gh44Gv5a6a576p5riI44G/44Gu6Zai5pWw44KS5Luj5YWl44GZ44KL44Kk44Oh44O844K444CC44Oh44K944OD44OJ5Y+C54WnLCBTeXN0ZW0ub3V0OjpwcmludGxuIOOBqOWQjOOBmOOCpOODoeODvOOCuOOAggp2YXIgcHJpbnRTdHIyID0gcHJpbnRsbgoKLy8gcHJpbnRTdHIxLCBwcmludFN0cjLjganjgaHjgonjgoLplqLmlbDjgarjga7jgafjgIFg5aSJ5pWwKOW8leaVsClgIOOBruW9ouW8j+OBp+mWouaVsOOBruWun+ihjOOBjOOBp+OBjeOCi+OAggovLyAgSmF2YeOBoOOBqOOAgUNvbnN1bWVy44KERnVuY3Rpb27jgb/jgZ/jgYTjgarjgqrjg5bjgrjjgqfjgq/jg4jjgajjgZfjgablrprnvqnjgZXjgozjgovjga7jgafjgIFwcmludFN0ci5hcHBseSgiaGVsbG8iKeOBv+OBn+OBhOOBq+OBl+OBquOBhOOBqOOBhOOBkeOBquOBhOOAggpwcmludFN0cjEoImhlbGxvMSIpCnByaW50U3RyMigiaGVsbG8yIikKCgovLyDplqLmlbDjgpLlvJXmlbDjgavlj5bjgovplqLmlbDjga7kvosKZnVuY3Rpb24gbXlGb3JFYWNoKGxpc3QsIGZ1bmMpIHsgLy8gZnVuY+OBr+OAgWphdmHjgaDjgajjgIFDb25zdW1lcjxUPuOBv+OBn+OBhOOBq+W8leaVsOOBruaVsOOBqOaIu+OCiuWApOOBruacieeEoeOBq+W/nOOBmOOBn+OCpOODs+OCv+ODvOODleOCp+ODvOOCueWei+OBq+OBmeOCi+OAggoJZm9yKHZhciBpID0gMDsgaTxsaXN0Lmxlbmd0aDtpKyspIHsKCQlmdW5jKGxpc3RbaV0pIC8vIGphdmHjgarjgonjgIFmdW5jLmFwcGx5KGxpc3QuZ2V0KGkpKQoJfQp9CgovLyDplqLmlbDjgpLku6PlhaXjgZfjgZ/lpInmlbDjgpLmuKHjgZnjgZPjgajjgoLjgafjgY3jgovjgZcuCm15Rm9yRWFjaChbMSwyLDNdLCBwcmludFN0cjEpOwoKLy8g44Op44Og44OA5byPKOeEoeWQjemWouaVsCnjgpLmuKHjgZnjgZPjgajjgoLjgafjgY3jgovjgZfjgIEKbXlGb3JFYWNoKFs0LDUsNl0sIGZ1bmN0aW9uKGkpe3ByaW50bG4oaSl9KSAvLyBKYXZh44Gq44KJ44CBIGkgLT4gU3lzdGVtLm91dC5wcmludGxuKGkpCgovLyDplqLmlbDjga7lkI3liY3jgafjgIHplqLmlbDjgZ3jga7jgoLjga7jgpLmuKHjgZnjgZPjgajjgoLjgafjgY3jgosKbXlGb3JFYWNoKFs3LDgsOV0sIHByaW50bG4pIC8vIEphdmHjgarjgonjgIEgU3lzdGVtLm91dDo6cHJpbnRsbiDjgafjg6Hjgr3jg4Pjg4nlj4LnhafjgajlkIzjgZjjgIIK