Giriş
Açıklaması şöyle. Object::mymethod() şeklinde kullanılır.
Method Refence bir nesne için bir kere alınır. Elimizde şöyle bir kod olsun
Şöyle yaparız.
Açıklaması şöyle. Object::mymethod() şeklinde kullanılır.
ÖrnekThe timing of method reference expression evaluation is more complex than that of lambda expressions (§15.27.4). When a method reference expression has an expression (rather than a type) preceding the :: separator, that subexpression is evaluated immediately. The result of evaluation is stored until the method of the corresponding functional interface type is invoked; at that point, the result is used as the target reference for the invocation. This means the expression preceding the :: separator is evaluated only when the program encounters the method reference expression, and is not re-evaluated on subsequent invocations on the functional interface type.
Method Refence bir nesne için bir kere alınır. Elimizde şöyle bir kod olsun
public class Instance {
int member;
Instance set(int value){
this.member = value;
return this;
}
@Override
public String toString() {
return member + "";
}
public static void main(String[] args) {
Stream<Integer> stream1 = Stream.of(1, 2, 3, 4);
Stream<Integer> stream2 = Stream.of(1, 2, 3, 4);
List<Instance> collect1 = stream1.map(i -> new Instance().set(i))
.collect(Collectors.toList());
List<Instance> collect2 = stream2.map(new Instance()::set)
.collect(Collectors.toList());
System.out.println(collect1);
System.out.println(collect2);
}
}
Çıktı olarak şunu alırız. Çünkü ikinci kullanımda yeni bir Instance yaratıldıktan sonra hep aynı nesne kullanılıyor.[1, 2, 3, 4]
[4, 4, 4, 4]
Method Reference'tan Function'a Dönüştürme Genel Kullanım
Örnek
Şöyle yaparız. Instance null olsa bile kod derlenir ve çalışır.String s = "Hello World";
Function<Integer, String> f = s::substring;
s = null;
System.out.println(f.apply(5));
Lambda değişkenin final olmasını istediği için şu kod derlenmez.String s = "Hello World";
Function<Integer, String> f = i -> s.substring(i); // Doesn't compile!
s = null;
System.out.println(f.apply(5));
ÖrnekŞöyle yaparız.
NameCreator creator = new NameCreator();
Function<String, String> func = creator::createName;
Method Reference'tan Function'a Dönüştürme - Lambda İçin
Örnek
Şöyle yaparız
Supplier<Integer> ageSupplier=Person::getAge; // does not compile
Function<Void,Integer> ageFunction=Person::getAge; //also does not compile
Function<Person,Integer> ageFunction=Person::getAge; //compiles correctly.
people.stream().map(ageFunction)
.filter(age -> age > 25)
.forEach(System.out::println);
Hiç yorum yok:
Yorum Gönder