// Ignore the magic object, it is redis internal stuff implementation
protected val map
: collection.
mutable.
Map[String, Any
] = collection.
mutable.
Map.
empty def set
[T
](name
: String, value
: T
): Boolean
= { map
(name
) = value
; true } def get
[T
](name
: String
): Option
[T
] = map.
get(name
).
map(_.
asInstanceOf[T
]) }
implicit def objectValueToValue
[T
](ov
: RedisObjectValue
[T
]): T
= { ov.get
}
}
case class RedisObjectValue
[T
](name
: String, default
: T
) { def :=(value
: T
): Boolean
= { RedisMagic.set[T](name, value)
}
RedisMagic.get[T](name).getOrElse(default)
}
case ov
: RedisObjectValue
[T
] => if (this.
hashCode() == ov.
hashCode()) true // Same reference // If we don't compare to another RedisObjectValue, let the equals method of data type handle it
}
}
class Player
(_id
: Long
) { protected def saveName
(valName
: String
): String
= _id +
":" + valName
val userId
= new RedisObjectValue
[Long
](saveName
("userId"), 0l
) val name
= new RedisObjectValue
[String
](saveName
("name"),
"Unknown") }
player1.userId := 42
player1.name := "God"
player2.userId := 2
player2.name := "Unknown"
val list
= Vector
(player1, player2
) val filtered
= list.
filter(_.
userId == 42) System.out.println("Count of filtered: " + filtered.length)
}
Ly8gSWdub3JlIHRoZSBtYWdpYyBvYmplY3QsIGl0IGlzIHJlZGlzIGludGVybmFsIHN0dWZmIGltcGxlbWVudGF0aW9uCm9iamVjdCBSZWRpc01hZ2ljIHsKCXByb3RlY3RlZCB2YWwgbWFwOiBjb2xsZWN0aW9uLm11dGFibGUuTWFwW1N0cmluZywgQW55XSA9IGNvbGxlY3Rpb24ubXV0YWJsZS5NYXAuZW1wdHkKCWRlZiBzZXRbVF0obmFtZTogU3RyaW5nLCB2YWx1ZTogVCk6IEJvb2xlYW4gPSB7IG1hcChuYW1lKSA9IHZhbHVlOyB0cnVlIH0KCWRlZiBnZXRbVF0obmFtZTogU3RyaW5nKTogT3B0aW9uW1RdID0gbWFwLmdldChuYW1lKS5tYXAoXy5hc0luc3RhbmNlT2ZbVF0pCn0KCm9iamVjdCBSZWRpc09iamVjdFZhbHVlIHsKICBpbXBsaWNpdCBkZWYgb2JqZWN0VmFsdWVUb1ZhbHVlW1RdKG92OiBSZWRpc09iamVjdFZhbHVlW1RdKTogVCA9IHsKICAgIG92LmdldAogIH0KfQoKY2FzZSBjbGFzcyBSZWRpc09iamVjdFZhbHVlW1RdKG5hbWU6IFN0cmluZywgZGVmYXVsdDogVCkgewogIGRlZiA6PSh2YWx1ZTogVCk6IEJvb2xlYW4gPSB7CiAgICBSZWRpc01hZ2ljLnNldFtUXShuYW1lLCB2YWx1ZSkKICB9CgogIGRlZiBnZXQ6IFQgPSB7CiAgICBSZWRpc01hZ2ljLmdldFtUXShuYW1lKS5nZXRPckVsc2UoZGVmYXVsdCkKICB9CgogIG92ZXJyaWRlIGRlZiBlcXVhbHMobzogQW55KSA9IG8gbWF0Y2ggewogICAgY2FzZSBvdjogUmVkaXNPYmplY3RWYWx1ZVtUXSA9PgogICAgICBpZiAodGhpcy5oYXNoQ29kZSgpID09IG92Lmhhc2hDb2RlKCkpIHRydWUgLy8gU2FtZSByZWZlcmVuY2UKICAgICAgZWxzZSB0aGlzLmdldCA9PSBvdi5nZXQKICAgIGNhc2UgdiA9PgogICAgICAvLyBJZiB3ZSBkb24ndCBjb21wYXJlIHRvIGFub3RoZXIgUmVkaXNPYmplY3RWYWx1ZSwgbGV0IHRoZSBlcXVhbHMgbWV0aG9kIG9mIGRhdGEgdHlwZSBoYW5kbGUgaXQKICAgICAgdGhpcy5nZXQuZXF1YWxzKHYpCiAgfQp9CgpjbGFzcyBQbGF5ZXIoX2lkOiBMb25nKSB7Cglwcm90ZWN0ZWQgZGVmIHNhdmVOYW1lKHZhbE5hbWU6IFN0cmluZyk6IFN0cmluZyA9IF9pZCArICI6IiArIHZhbE5hbWUKCXZhbCB1c2VySWQgPSBuZXcgUmVkaXNPYmplY3RWYWx1ZVtMb25nXShzYXZlTmFtZSgidXNlcklkIiksIDBsKQoJdmFsIG5hbWUgPSBuZXcgUmVkaXNPYmplY3RWYWx1ZVtTdHJpbmddKHNhdmVOYW1lKCJuYW1lIiksICJVbmtub3duIikKfQoKb2JqZWN0IE1haW4gZXh0ZW5kcyBBcHAgewoJdmFsIHBsYXllcjEgPSBuZXcgUGxheWVyKDEpCglwbGF5ZXIxLnVzZXJJZCA6PSA0MgoJcGxheWVyMS5uYW1lIDo9ICJHb2QiCgl2YWwgcGxheWVyMiA9IG5ldyBQbGF5ZXIoMikKCXBsYXllcjIudXNlcklkIDo9IDIKCXBsYXllcjIubmFtZSA6PSAiVW5rbm93biIKCQoJdmFsIGxpc3QgPSBWZWN0b3IocGxheWVyMSwgcGxheWVyMikKCXZhbCBmaWx0ZXJlZCA9IGxpc3QuZmlsdGVyKF8udXNlcklkID09IDQyKQoJU3lzdGVtLm91dC5wcmludGxuKCJDb3VudCBvZiBmaWx0ZXJlZDogIiArIGZpbHRlcmVkLmxlbmd0aCkKfQ==