14 Kasım 2017 Salı

Supplier Arayüzü

Giriş
Şu satırı dahil ederiz.
import java.util.function.Supplier;
Parametre almaz ve sonuç olarak bir nesne döner. Bu açından Callable ile aynıdır. Ancak Callable'dan farklı olarak checked exception fırlatmaz.

Guava'da da benzer bir sınıf var. Stream'i doldurmak için Stream.generate() metoduna parametre olarak kullanılır.

Aslında supplier bence factory örüntüsü ile aynı şey.

constructor - lambda
Örnek
Tek bir nesne sağlayan bir Supplier için şöyle yaparız.
java.util.function.Supplier<String> supplier = () -> "test";
Örnek
Her seferinde farklı bir nesne sağlayan Supplier için için şöyle yaparız. Bu kod Stream'i 10 tane farkı nesne ile doldurur.
Supplier<Test> supplier = () -> new Test();
List<Test> list = Stream
            .generate(supplier)
            .limit(10)
            .collect(Collectors.toList());
System.out.println(list.size()); // 10
// Prints false, showing it really is calling the supplier
// once per iteration.
System.out.println(list.get(0) == list.get(1));
Örnek
Şöyle yaparız.
Supplier<Thread> supplier = (Supplier<Thread> & Serializable)
  ()
-> new Thread() {}; Açıklaması şöyle
The anonymous class declaration new Thread() {} and you are not in a static context, so this expression implicitly captures this.
Lambda içinde this capture edilmesin istersek şöyle yaparız.
static void write() throws Exception {
  Supplier<Thread> supplier = (Supplier<Thread> & Serializable)
    () -> new Thread() {};
  ...
}
constructor - Method Reference
Method Reference alır. Şöyle yaparız.
Supplier<Student> myStudent = Student::new;
get metodu
Şöyle yaparız.
Supplier<int[]> supplier = ...;
int[] primes = supplier.get();
Şöyle yaparız.
public class NaturalNumbers implements Supplier<Integer> {
  private int i = 0;
  public Integer get() { return ++i; }
}
Stream oluşturmak için şöyle yaparız.
Stream<Integer> s =
  Stream.generate(new NaturalNumbers());
Supplier Niçin Lazım
En en önemli avantajı nesnenin yaratılmasını ötelemesi. Açıklaması şöyle
Using a Supplier postpones the creation of the instance.
Aradaki farkı görmek için şöyle yaparız.
public void makeNewThingSometimes (T newInstance)
{
  if (someCondition) {
    this.instance = newInstance;
  }
}

public void makeNewThingSometimes (Supplier<T> supplier)
{
  if (someCondition) {
    this.instance = supplier.get();
  }
}

Hiç yorum yok:

Yorum Gönder