Anahtarları Kullanma
Bir anahtar kullanarak veri alma ve sunma
Bir veri taşıyıcısı, :javadoc: ‘Key’ ile tanımlanan tek bir veri noktasını geri getirmek veya değiştirmek için yöntemler sağlar. Bir örnekle başlayalım:
Kod Örneği: Mümkünse bir veri taşıyıcıyı iyileştirin
import org.spongepowered.api.data.DataHolder;
import org.spongepowered.api.data.key.Keys;
public void heal(DataHolder target) {
if (target.supports(Keys.HEALTH)) {
double maxHealth = target.get(Keys.MAX_HEALTH).get();
target.offer(Keys.HEALTH, maxHealth);
}
}
Şimdi yukarıdaki işlev ayrıntıları için.
The first line checks if our given data holder supports a current health value. Only if it does, it can be healed after
all. Since a data holder cannot have current health without having a maximum health and vice versa, a check for
one of the keys using the supports()
method suffices.
İkinci satır veri tutucuya maksimum sağlığını sormak için get()
fonksiyonunu kullanır.``get()`` fonksiyonunun yanında``getOrNull()`` ve getOrElse()
fonksiyonları da vardır, hepsi ilk parametre olarak
Key
fonksiyonunu kabul eder. Genellikle istenen veride bir Optional
olarak dönecek olan ya da veri tutucu sağlanan şifreyi desteklemediğinde Optional.empty()
olarak dönen get()
kullanılmalıdır.``Key`` in desteklendiğini zaten doğruladığımız için,daha fazla kontrol yapmadan sadece opsiyoneldeki``get()``i kullanabiliriz.Ayrıca getOrNull()``u da kullanabiliriz ki bu da basitçe ``get(key).orNull()
kısayoludur, böylelikle Optional
dan kurtulabiliriz.Üçüncü ihtimal değer veri tutucuda olmayınca dönen ve ikinci parametreyi varsayılan değer olarak kabul eden getOrElse()
olabilir.
Üçüncü satırda veri tutucuya veri dönüşü öneriyoruz.Maksimum sağlığı kazanmadan önceki ve güncel sağlığı simgeleyen bir Key
sağlıyoruz ve böylelikle veri tutucu maksimum sağlığa ulaşıyor.Farklı parametre serileri kabul eden birçok offer()
metodu var , hepsi de öneri kabul edilirse veri içeren bir :javadoc: DataTransactionResult olarak döner.Şimdilik sadece bir tane Key
ve uyumlu olan değer kullanacağız,ama ileriki sayfalarda daha fazlasıyla karşılaşacağız.Önerimizin güncel sağlığının kabul edildiğini zaten bildiğimiz için ( çünkü veri tutucu destekliyor) , sessizce sonucu çıkarabiliriz.
Aynı zamanda remove()
fonksiyonunu kullanarak bir :javadoc: DataHolder``dan bilgiyi tamamen silmek mümkündür.Basitçe silmek istediğiniz dosyayı simgeleyen bir ``Key
oluşturun.Sonraki örnek, verilen veri tutucudan özel bir isim silmeyi deneyecek:
public void removeName(DataHolder target) {
target.remove(Keys.DISPLAY_NAME);
}
Veri dönüştürme
Değer elde etme, değiştirme ve önerme dışında veriyle ilgili bir yol daha var. Veri tutucunun transform()
metodunu kullanarak Key
ve Function``ı geçebiliriz. Kodun değeri yeniden kazanılır ve verilen fonksiyon ona uygulanır. Sonuç kodun altında kayıtlanır ve``transform()
metodu anında ``DataTransactionResult``a döner.
Şimdi, örnek olarak, bir veri tutucuyu maksimum sağlığını iki katına çıkararak güçlendirdiğimizi hayal edin.
import java.util.function.Function;
public void buff(DataHolder target) {
target.transform(Keys.MAX_HEALTH, new Function<Double,Double>() {
@Override
public Double apply(Double input) {
return (input == null) ? 0 : input * 2;
}
});
}
Veya Java 8’i kullanırsanız, satırı lambda ifadeleri ile kısaltabilirsiniz:
public void buff(DataHolder target) {
target.transform(Keys.MAX_HEALTH, d -> (d == null) ? 0 : 2*d);
}
İki durumda da geçen fonksiyonun null``u geçtiğinden emin olmalıyız.Ayrıca hedef aslında :javadoc:`Keys#MAX_HEALTH` anahtarını destekliyorsa hiçbir kontrolün gerçekleşmediğini farkedeceksiniz.Eğer hedef desteklemiyorsa, ``transform()
fonksiyonu başarısız olacak ve DataTransactionResult
olarak geri dönecek.
Anahtarlı Değerler
There are cases where you may care about not only the direct value for a Key, but the keyed value
encapsulating it. In that case, use the getValue(key)
method instead of get(key)
. You will receive an
object inheriting from Value which contains a copy of the original value. As Keys#SPAWNABLE_ENTITIES
is a WeightedCollectionValue, we can get a list of potentional entity that could spawn using the Value
of the key.
Örnek Kod: Bir hedefi ölümün eşiğine getir
public void scare(DataHolder target) {
if (target.supports(Keys.NEXT_ENTITY_TO_SPAWN)) {
WeightedCollectionValue value = target.getValue(Keys.NEXT_ENTITY_TO_SPAWN).get();
List<Entity> entities = value.get(new Random());
}
}