Bu Sayfayı Paylaş:

Kavram

Functional Interface

Tanım: Tek bir method'u bulunan ve @FuncationalInterface annotation'ı ile tanımlanan interface. Bu türden interface'ler Lambda operatörü ile kullanılabilir.

Veri

java.util.function Paketindeki Functional Interface'ler

java.util.function paketi çeşitli şekillerde Functional Interface'ler sağlamaktadır. Bu şekillere uygun bir functional interface yapmak yerine buradaki interface'ler kullanılabilir. Functional Interface'ler aşağıdaki gibidir :
  • Consumer : Bir argüman alır ve geri bir şey döndürmez
  • Predicate : Bir argüman alır ve bir boolean değer döndürür.
  • Function : Bir argüman alır ve geri bir değer döndürür
  • Supplier : Argüman almaz ve geri bir değer döndürür
  • BiConsumer : İki argüman alır ve geri bir şey döndürmez
  • BiPredicate : İki argüman alır ve geriye bir boolean değer döndürür
  • BiFunction : İki argüman alır ve tek bir değer döndürür
  • UnaryOperator : Argüman alır ve yine aynı argümanı geri döndürür. Function'dan türer.
  • BinaryOperator : İki argüman alır ve yine aynı tipte bir argüman döner. BiFunction'dan türer
Yukarıdaki interface'ler için basit tiplere göre versiyonları da bulunmaktadır. Örneğin int için :
  • IntConsumer : Int bir argüman alır ve geri bir şey döndürmez
  • IntPredicate : Int bir argüman alır ve bir boolean değer döndürür.
  • IntFunction : Int bir argüman alır ve geri bir değer döndürür
  • IntSupplier : Argüman almaz ve geri bir int değer döndürür
  • IntUnaryOperator : Int argüman alır ve yine aynı argümanı geri döndürür.
  • IntBinaryOperator: İki int argüman alır ve yine aynı tipte bir argüman döner.

Int gibi, long, double, Object tipleri destekleyen interface'ler bulunmaktadır. Bir de farklı tipte argüman alıp farklı tipte döndüren vb.. farklı interface'lerde bulunmaktadır. Bu interface'lerin tamamını java.util.function paketinde görebilirsiniz.

Örnek

Predicate Interface'ini Kullanarak İstenilen Koşula Uyan Değerleri Bastıran Örnek

Bir integer listemiz olsun. Bir print fonksiyonu yapıyoruz ve bu fonksiyona bir liste veriyoruz. Listenin yanında bir de Predicate funcational interface'si veriyoruz. print method'u elemanları listelerken Predicate funcational interface'ni soracak, eğer true cevabı gelirse o eleman listelenecek.
package com.test.functionalinterface;

import java.util.Arrays;
import java.util.List;
import java.util.function.Predicate;

public class ListTestForPredicate {

	public void print(List<Integer> list, Predicate<Integer> predicate) {

		for (Integer n : list) {
			
			if (predicate.test(n)) {
				
				System.out.println(n);
				
			}
			
		}

	}
	
	public static void main(String[] args) {
		
	      List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
	      
	      ListTestForPredicate test=new ListTestForPredicate();
	      
	      test.print(list, n -> n%2 == 0 );
	      
	      test.print(list, n -> n%2 == 1 );
		
	}

}
print fonksiyonu görüldüğü gibi predicate parametresini almaktadır. if (predicate.test(n)) satırında predicate'e sormaktadır. Eğer boolean cevabı gelirse ekrana eleman basılmaktadır. test.print(list, n -> n%2 == 0 ) ile (lambda kullanılıyor) önce çift elemanlar, test.print(list, n -> n%2 == 1 ) ile de sonra tek elemanlar bastırılmıştır. Çıktı aşağıdaki gibi olacaktır: 2 4 6 8 10 1 3 5 7 9

Örnek

BinaryOperator Interface'ini Kullanarak Liste Üzerinde Bir İşlem Uygulamak

Bir integer listemiz olsun. Bir applyAll fonksiyonu yapıyoruz ve bu fonksiyona bir liste veriyoruz. Listenin yanında bir de BinaryOperator funcational interface'si veriyoruz. applyAll method'u elemanları işlerken BinaryOperator funcational interface'ni çağırmaktadır. Her eleman ile son kalan değer işleme sokulmaktadır:
package com.test.functionalinterface;

import java.util.Arrays;
import java.util.List;
import java.util.function.BinaryOperator;

public class ListTestForBinaryOperator {

	public Integer applyAll(List<Integer> list, BinaryOperator<Integer> binaryOperator) {
		
		int result=list.get(0);

		for (int i=1 ; i<list.size(); i++) {
			
			result=binaryOperator.apply(list.get(i), result);
			
		}
		
		return result;

	}
	
	public static void main(String[] args) {
		
	      List<Integer> list = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
	      
	      ListTestForBinaryOperator test=new ListTestForBinaryOperator();
	      
	      int result1=test.applyAll(list, (t1,t2) -> t1+t2);
	      
	      System.out.println("result1 : "+result1);
	      
	      int result2=test.applyAll(list, (t1,t2) -> t1*t2);
	      
	      System.out.println("result2 : "+result2);

	}

}
applyAll fonksiyonu görüldüğü gibi binaryOperator parametresini almaktadır. Sürekli yeni elamanları result=binaryOperator.apply(list.get(i), result); şeklinde işleme sokmaktadır. int result1=test.applyAll(list, (t1,t2) -> t1+t2); ile (lambda kullanılıyor) önce listenin tüm elemanlarını topluyoruz, int result2=test.applyAll(list, (t1,t2) -> t1*t2); ile de listenin tüm elemanlarını çarpımını buluyoruz. Çıktı aşağıdaki gibi olacaktır: result1 : 55 result2 : 3628800



Bu Sayfayı Paylaş:

İletişim Bilgileri

Takip Et

Her Hakkı Saklıdır. Bu sitede yayınlanan tüm bilgi ve fikirlerin kullanımından fibiler.com sorumlu değildir. Bu sitede üretilmiş , derlenmiş içerikleri, fibiler.com'u kaynak göstermek koşuluyla kendi sitenizde kullanılabilirsiniz. Ancak telif hakkı olan içeriklerin hakları sahiplerine aittir