Я думаю, что стоит объяснить их использование в вызовах функций и почему происходят разные вещи. Поскольку кто-то уже сказал, что фигурные скобки определяют блок кода, который также является выражением, поэтому можно поставить выражение, в котором ожидается выражение, и оно будет оценено. Когда оценивается, его операторы выполняются, а значение последнего оператора - результат оценки целочисленного блока (несколько как в Ruby).
Имея это, мы можем делать такие вещи, как:
2 + { 3 } // res: Int = 5
val x = { 4 } // res: x: Int = 4
List({1},{2},{3}) // res: List[Int] = List(1,2,3)
Последний пример - это просто вызов функции с тремя параметрами, каждый из которых сначала оценивается.
Теперь, чтобы увидеть, как он работает с вызовами функций, давайте определим простую функцию, которая возьмет другую функцию в качестве параметра.
def foo(f: Int => Unit) = { println("Entering foo"); f(4) }
Чтобы вызвать ее, нам нужно передать функцию, которая принимает один param из типа Int, поэтому мы можем использовать функциональный литерал и передать его foo:
foo( x => println(x) )
Теперь, как сказано ранее, мы можем использовать блок кода вместо выражения, поэтому давайте использовать его
foo({ x => println(x) })
Что здесь происходит, так это то, что код внутри {} оценивается, а значение функции возвращается как значение оценки блока, это значение затем передается в foo. Это семантически то же самое, что и предыдущий вызов.
Но мы можем добавить что-то еще:
foo({ println("Hey"); x => println(x) })
Теперь наш блок кода содержит два оператора и потому, что он вычисляется до выполнения foo , происходит то, что сначала печатается «Эй», затем наша функция передается в foo, «Ввод foo» печатается и, наконец, печатается «4».
Это выглядит немного уродливым, хотя Scala позволяет мы должны пропустить скобку в этом случае, поэтому мы можем написать:
foo { println("Hey"); x => println(x) }
или
foo { x => println(x) }
Это выглядит намного приятнее и эквивалентно предыдущим. Здесь сначала вычисляется блок кода, и результат оценки (который является x => println (x)) передается как аргумент для foo.
Вы должны ожидать результата в вызове вашего метода, например:
FirebaseUser currentUser = await class.getCurrentUser();
if (currentUser != null) {
// Do something
}