Мы можем объединить две коллекции, используя sub-запрос mongoDB. Вот пример, Комментарии -
`db.commentss.insert([
{ uid:12345, pid:444, comment:"blah" },
{ uid:12345, pid:888, comment:"asdf" },
{ uid:99999, pid:444, comment:"qwer" }])`
Пользователи -
db.userss.insert([
{ uid:12345, name:"john" },
{ uid:99999, name:"mia" }])
Суб-запрос MongoDB для JOIN -
`db.commentss.find().forEach(
function (newComments) {
newComments.userss = db.userss.find( { "uid": newComments.uid } ).toArray();
db.newCommentUsers.insert(newComments);
}
);`
Получить результат из недавно созданная коллекция -
db.newCommentUsers.find().pretty()
Результат -
`{
"_id" : ObjectId("5511236e29709afa03f226ef"),
"uid" : 12345,
"pid" : 444,
"comment" : "blah",
"userss" : [
{
"_id" : ObjectId("5511238129709afa03f226f2"),
"uid" : 12345,
"name" : "john"
}
]
}
{
"_id" : ObjectId("5511236e29709afa03f226f0"),
"uid" : 12345,
"pid" : 888,
"comment" : "asdf",
"userss" : [
{
"_id" : ObjectId("5511238129709afa03f226f2"),
"uid" : 12345,
"name" : "john"
}
]
}
{
"_id" : ObjectId("5511236e29709afa03f226f1"),
"uid" : 99999,
"pid" : 444,
"comment" : "qwer",
"userss" : [
{
"_id" : ObjectId("5511238129709afa03f226f3"),
"uid" : 99999,
"name" : "mia"
}
]
}`
Надеюсь, что это поможет.
Фигурные скобки обозначают содержание лямбда-выражения. Kotlin уже передал экземпляр OnClickListener за кулисы и предоставляет вам метод onClick()
.
Если вы хотите передать прослушиватель, назначенный переменной, используйте круглые скобки:
button.setOnClickListener(clickListener)
Если вы хотите использовать функцию, она такая же, как Java:
button.setOnClickListener(this::clickListener)
fun clickListener(v: View) {}
Вы можете сделать это в kotlin. Заменить фигурные скобки на круглые скобки.
btn.setOnClickListener (this::clicklistener)
fun clicklistener(v: View){}
Как уже упоминал Странник, фигурные скобки здесь означают тело лямбды. Kotlin поддерживает размещение обратных вызовов вне регулярных скобок .
Это:
button.setOnClickListener {clickListener()}
Равно равно:
button.setOnClickListener({clickListener()})
, что равно:
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
clickListener();
}
});
Или (только Java 8) :
button.setOnClickListener(view -> clickListener());
TL; DR: содержимое аргументов функции определяется с помощью ()
, а лямбда-тела определяются с помощью {}
(так же, как с обычными функциями, классами, интерфейсами , так далее.).
Теперь, во-первых, обратный вызов метода onClick принимает аргумент view
. Если вы используете автономную функцию, у нее должен быть следующий аргумент:
fun clickListener(view: View) { TODO("Place your listener code here") }
Это основано на именовании - если вы реализуете OnClickListener
, просто передайте this
в качестве аргумента. У вас уже есть слушатель и функция, поэтому вам не нужно явно определять, что передать. Однако, если вы реализуете OnClickListener
, обязательно проверьте идентификатор перед выполнением действия, если у вас есть несколько представлений, использующих его в качестве прослушивателя.
Если вы используете методы, следующее зависит от того, как.
var
или val
Если ваш обратный вызов определен как:
val listener = {view: View ->
TODO()
}
Вы можете передать его как аргумент:
button.setOnClickListener(listener)
[1126 ] OnClickListeners Если у вас есть var onClickListener: OnClickListener
, применяются те же функции, что и с функциями var
/ val
.
Если у вас есть fun clickListener
, вам придется добавить лямбду, чтобы передать его. Это, как и в случае с Java, использовать ::
. Однако вам не нужно явно объявлять область действия, как в Java. Это означает, что любой из них будет работать:
button.setOnClickListener(::clickListener);
button.setOnClickListener(this::clickListener);
// alternatively with a different target, if it's somewhere else.