23 Ağustos 2017 Çarşamba

MethodHandles Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.lang.reflect.Method;
import java.lang.invoke.*;
lookup metodu
Bir MethodHandle nesnesi döndürür. Elimizde Foo ata sınıfı olsun.
public class Foo {
  public void doit() {
    System.out.println("good");
  }
}
Bu sınıftan kalıtan Bar sınıfı olsun
public class Bar extends Foo {
  public void doit() {
    System.out.println("bad");
  }
}
Foo sınıfının doIt () metoduna erişmek için şöyle yaparız.
Bar b = new Bar();
Method m = Foo.class.getDeclaredMethod("doit", new Class[]{});
MethodHandle h = MethodHandles.lookup().unreflectSpecial(m, Bar.class);
h.invoke(b);


NavigableMap Arayüzü

Giriş
NavigableMap aynı zamanda bir SortedMap. Kalıtım hiyerarşisi şöyle:

SortedMap <---NavigableMap<--TreeMap

Sıralı Anahtarlar
Elemenalar sıralı tutulur
; key->value
10->A
15->B
20->C
Bu yüzden anahatar değerleri büyükten küçüğe dolaşmak mümkün.

Örnek
Bir metodun %30 diğerini %70 çalışmasını istiyoruz. Random sınıfı < 0.3 üretirse bir metodu çalıştırırız. [0.3 - 1.0) arasında bir değer üretirse başka bir metodu çalıştırırız..Şöyle yaparız.
NavigableMap<Double, Runnable> runnables = new TreeMap<>();

runnables.put(0.3, this::30PercentMethod);
runnables.put(1.0, this::70PercentMethod);

double percentage = Math.random();
for (Map.Entry<Double, Runnable> entry : runnables){
    if (entry.getKey() < percentage) {
        entry.getValue().run();
        break; // make sure you only call one method
    }
}
Kullanılan metodlar NavigableSet ile aynı anlama geliyor. Aralarındaki tek fark NavigableMap metodları Entry kelimesi ile biterler, yani xxxEntry şeklinde olurlar.

Bu sınıf <,<=,>,>= şeklinde liste veya tek eleman sorgulama imkanı tanır.
constructor
Şöyle yaparız.
NavigableMap<Double, Runnable> map = new TreeMap<>();
floorEntry (<=)
Şöyle yaparız
private static <K, V> V mappedValue(TreeMap<K, V> map, K key) {
  Entry<K, V> e = map.floorEntry(key);//<= koşullunu sağlayanı ara
  if (e == null && e.getValue() == null) {//Eleman varsa, değeri null ise
     e = map.lowerEntry(key);//< koşulunu sağlayan en büyük elemanı bul
  }
  return e == null ? null : e.getValue();
}
ceilingEntry (>= )
Verilen elemandan büyük eşit olan ilk eleman alınır.Şöyle yaparız
NavigableMap<Float, String> neededMap = new TreeMap<Float, String>();
neededMap.put(1.0f, "first!");
neededMap.put(3.0f, "second!");
System.out.println(neededMap.ceilingEntry(2.0f));//"3.0=second!" verir
put metodu
Şöyle yaparız.
map.put(0.3, "30");
pollLastEntry
Bu metod ile en büyük elemanı almak mümkün.

21 Ağustos 2017 Pazartesi

JAXB XmlJavaTypeAdapter Anotasyonu

Giriş
Şu satırı dahil ederiz.
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
Bu sınıfın kullanımını anlatan bir yazı burada.

Tanımlama
Şöyle yaparız.
import javax.xml.bind.annotation.adapters.XmlAdapter;

public class MappingsAdapter extends alo XmlAdapter<MappingsAdapter.AdaptedMap, Map<String, Mapping>>{

  @Override
  public Map<String, Mapping> unmarshal(AdaptedMap v) throws Exception {
    Map<String, Mapping> mappings = new HashMap<String, Mapping>();
    for(Mapping mapping : v.mappings) {
       mappings.put(mapping.product, mapping);
    }
    return mappings;
  }

  @Override
  public AdaptedMap marshal(Map<String, Mapping> v) throws Exception {
    AdaptedMap adaptedMap = new AdaptedMap();
    for(Entry<String,Mapping> entry : v.entrySet()) {
      adaptedMap.mappings.add(entry.getValue());
    }
    return adaptedMap;
  }

  static class AdaptedMap {
    public List<Mapping> mappings = new ArrayList<Mapping>();
  }
}