• Anasayfa
  • Eğitimler
    • JavaScript Eğitimi
    • Angular 2 Eğitimi
    • React.js Eğitimi
    • Java 8 Eğitimi
    • Java EE 7 Eğitimi
    • Spring Framework Eğitimi
    • Git Eğitimi
  • Online Eğitimler
    • Online React.js Eğitimi
    • Online Angular 2 Eğitimi
    • Online Spring Boot Eğitimi
  • Referanslar
  • Hakkında
  • İletişim
KodEdu
  • Anasayfa
  • Eğitimler
    • JavaScript Eğitimi
    • Angular 2 Eğitimi
    • React.js Eğitimi
    • Java 8 Eğitimi
    • Java EE 7 Eğitimi
    • Spring Framework Eğitimi
    • Git Eğitimi
  • Online Eğitimler
    • Online React.js Eğitimi
    • Online Angular 2 Eğitimi
    • Online Spring Boot Eğitimi
  • Referanslar
  • Hakkında
  • İletişim

Java 8 – Method Reference

  • Posted by Kodedu
  • Categories backend, Genel, Uncategorized
  • Date 29 Eylül 2014

Java programlama dilinde metodlar, sınıfların içinde bulunan iş birimleridir.

Metodlara erişimin ise statik olup olmadığına göre iki erişim biçimi vardır. Statik metodlara sınıf üzerinden erişilebilirken, statik olmayan metodlara nesne üzerinden erişim sağlanabilmektedir.

Java 8 ile beraber metod birimleri, bir lambda ifadesine, dolayısıyla bir fonksiyonel arayüze karşılık olarak referans verilebilmektedir.

Lambda ifadeleri yazılırken, tek metoda sahip arayüzün (fonksiyonel arayüz) metod girdi ve çıktısı baz alınmaktadır. Eğer daha önce yazdığınız bir metodun girdi ve çıktısı, bir fonksiyonel arayüz metodunun girdi ve çıktısına birebir uyuyorsa, o metod bir lambda deyimi yerine kullanılabilmektedir.

Örneğin;

Consumer arayüzü T türünde tek bir parametre alır. Metod dönüşü void ‘dir.

@FunctionalInterface
public interface Consumer<T> {

    void accept(T t); // t-> {}

}

Yukarıdaki Consumer arayüzü türünden bir nesneyi, e → {} lambda deyimiyle oluşturabiliriz.

Consumer<String> consumerWithLambda = e-> {

};

Lambda ifadeleri yazarken metod girdi ve çıktısına odaklandığımıza göre, lambda deyimiyle birebir örtüşen metodları, lambda deyimleri yerine kullanabilir miyiz? Bunu aşağıdaki metod üzerinden düşünelim.

public void herhangiBirMetod(String e){

}

Yani herhangiBirMetod metodunun imzasıyla Consumer<String> arayüzünün accept metodunun imzası birbiriyle aynıdır. herhangiBirMetod, String türünden tek bir parametre almaktadır, metod dönüşü ise void ‘dir. Bu uyum neticesinde eğer istenirse, bu metodun referansı ile Consumer<String> türünden bir nesne oluşturulabilir.

Bir metodu referans vermek

Java programlama dilinde bir metodun nasıl referans verileceği metodun statik olup olmadığına göre değişmektedir. Bir metodun referans olarak verilebilmesi için ise :: ikilisi kullanılır.

Statik metodlarda

Statik metodlar sınıfa ait bileşenlerdir. Bu yüzden erişim kurulurken dahili olduğu sınıf üzerinden erişim kurulur.

Örneğin;
Consumer<String> consumerWithMetRef = <ClassName>::herhangiBirMetod;
Statik olmayan metodlarda

Statik olmayan metodlar nesneye ait bileşenlerdir. Bu sebeple nesnenin referansı üzerinden erişilmelidirler.

Örneğin;
Consumer<String> consumerWithMetRef = <ObjectRef>::herhangiBirMetod;

Örnek 1

Şimdi birkaç örnek ile metod referansları deneyimleyelim. Aşağıda "Ali","Veli","Selami" verilerini içeren bir List nesnesi bulunmaktadır. Bu nesnenin ise, forEach isimli metodu bulunmaktadır. Bu nesnenin kabul ettiği parametre ise Consumer<String> türündendir.

List<String> names= Arrays.asList("Ali,Veli,Selami");

names.forEach(new Consumer<String>() { (1)
    @Override
    public void accept(String s) {
        System.out.println(s);
    }
});
  1. Sırayla konsole çıktılar.

Şimdi bu örneği Lambda ifadesiyle yeniden aşağıdaki gibi yazabiliriz.

List<String> names= Arrays.asList("Ali,Veli,Selami");

names.forEach(s->{
   System.out.println(s);
});

Lambda ifadesi, satır sayısı bazında kodu iyice kısalttı. Şimdi bu aynı işi metod referans kullanarak yapalım.

public class App{

    static List<String> names= Arrays.asList("Ali,Veli,Selami");

    // Statik metod
    public static void herhangiBirMetod(String s){
        System.out.println(s);
    }

    // Non-statik metod
    public void digerBirMetod(String s){
        System.out.println(s);
    }


    public static void main(String[] args){

        names.forEach(App::herhangiBirMetod); (1)

        // veya

        App app=new App();
        names.forEach(app::digerBirMetod); (2)

        // veya

        names.forEach(System.out::println); (3)




    }

}
  1. Statik metodu referans vermek

  2. Non-statik metodu referans vermek

  3. Diğer bir örnek

Örnek 2

Collections#sort metodu ile bir dizi nesneyi sıralamak istiyoruz diyelim. Bu sıralamayı, metodun 2. parametresinde Comparator türünden bir nesne ile kontrol edebiliriz.

List<Integer> numbers = Arrays.asList(5, 10, 1, 5, 6);

Collections.sort(numbers, new Comparator<Integer>() {
    @Override
    public int compare(Integer o1, Integer o2) {
        return o1 - o2;
    }
});
Not

Fonksiyonel olarak Comparator arayüzü ve java.util.BiFunction arayüzü birebir aynıdır.

Şimdi anonim olarak oluşturulan Comparator türünden nesneyi Lambda ifadeleriyle yeniden yazalım.

List<Integer> numbers = Arrays.asList(5, 10, 1, 5, 6);

Collections.sort(numbers, (o1, o2) -> o1 - o2)

Şimdi ise Lambda deyimi yerine metod referans kullanarak bu işi yapalım.

public Integer sirala(Integer o1, Integer o2){

    return o1 - o2;

}

public void birMetod(){

    List<Integer> numbers = Arrays.asList(5, 10, 1, 5, 6);

    Collections.sort(numbers, this::sirala); (1)
}
  1. Lambda yerine metod referansı

Metod referans kullanmak var olan iş mantığını kolay bir biçimde referans vermeye olanak sağlamaktadır.

Arşiv

https://kodedu.com/2014/01/video-java-8-nashorn-ile-javascript-webineri/

https://kodedu.com/2014/03/java-8-project-lambda-yenilikleri-webineri/

https://kodedu.com/2014/03/java-8-lambda-expressions-and-functional-interfaces/

https://kodedu.com/2014/04/java-8de-tarih-ve-saat-islemleri/

https://kodedu.com/2014/03/java-8-lambda-expression-nedir-nasil-kullanirim/

https://kodedu.com/2014/07/java-8-consumer-arayuzu/

https://kodedu.com/2014/09/java-8-tekrarli-notasyonlar-nasil-kullanilir/

Tekrar görüşmek dileğiyle.

Tag:backend, lambda

  • Share:
author avatar
Kodedu

Previous post

Java 8 - Tekrarlı Notasyonlar Nasıl Kullanılır?
29 Eylül 2014

Next post

Java 8 - Default Methods
6 Ekim 2014

You may also like

api-logo
Swagger Nedir? Neden kullanılır?
10 Ekim, 2018
spring-cli-logo
Spring CLI ile Spring Boot Projeleri Hazırlamak
21 Ağustos, 2017
eureka_architecture
Spring Cloud Netflix ve Eureka Service Discovery
3 Temmuz, 2017

Leave A Reply Cevabı iptal et

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

E-posta listesine kayıt olun!






Gözde yazılar

Java Mimarisiyle Kurumsal Çözümler : Kurumsal Java Kitabı
16Eyl2012
Java API for JSON Processing – Stream bazlı JSON Üretmek ve Tüketmek
06Ağu2013
AsciidocFX projesi Duke’s Choice Award 2015 ödülünü kazandı
28Eki2015
Knockout.js – Hesap Makinesi Örneği
02Şub2013

Son Yazılar

  • Java’da Record’lar 27 Ocak 2020
  • Swagger Nedir? Neden kullanılır? 10 Ekim 2018
  • Spring CLI ile Spring Boot Projeleri Hazırlamak 21 Ağustos 2017
  • Spring Cloud Netflix ve Eureka Service Discovery 3 Temmuz 2017
  • Online React.js Eğitimi ardından (15-25 Mayıs 2017) 31 Mayıs 2017

Son Yorumlar

  • Naïve Bayes Sınıflandırma Algoritması için Rahman Usta
  • Naïve Bayes Sınıflandırma Algoritması için Mete
  • YAML Nedir? Neden YAML Kullanmalıyız? için kara
  • JWT (JSON Web Tokens) Nedir? Ne işe yarar? için Furkan
  • YAML Nedir? Neden YAML Kullanmalıyız? için shahriyar

Get Java Software

Arşivler

Bizi takip edin

React.js Eğitimi Başlıyor
11-22 Eylül, 2017
Eğitmen
Rahman Usta
İletişim

merhaba@kodedu.com

  • Hakkında
  • Gizlilik Politikası
  • İletişim
  • Referanslar
Kodedu Bilişim Danışmanlık
Cemil Meriç mah. Çelebi sok.
No:16/3 Ümraniye/İSTANBUL
Tel: 0850 885 38 65
Alemdağ V.D.: 8960484815

KODEDU © Tüm hakları saklıdır.