9 Aralık 2019 Pazartesi

Function Arayüzü

Giriş
Şu satırı dahil ederiz.
import java.util.function.Function;
Java 8 ile şu functional programming için şu arayüzler geliyor.
Function — it takes one argument and returns a result
Consumer — it takes one argument and returns no result (represents a side effect)
Supplier — it takes no arguments and returns a result
Predicate — it takes one argument and returns a boolean
BiFunction — it takes two arguments and returns a result
BinaryOperator — it is similar to a BiFunction, taking two arguments and returning a result. The two arguments and the result are all of the same types
UnaryOperator – it is similar to a Function, taking a single argument and returning a result of the same type
Tek parametre alan ve sonuç dönen bir metodu temsil eder. Şöyle düşünülebilir. T tpini alır R tipini döner.
         _ _ _ _ _ _ _ 
        |             |
  T --> |   function  | --> R
        |_ _ _ _ _ _ _| 
constructor - lambda
Şöyle yaparız.
Function<String, Boolean> functionTest = str -> str.length()> 5;      
System.out.println(functionTest.apply("Function"));
constructor - üye metod
Şöyle yaparız.
public class MethodRefs {
 
  Function<MethodRefs, String> f = MethodRefs::getValue;

  public String getValue() {
    return "4";  }
  ...
}
constructor - static metodu
Şöyle yaparız.
public class MethodRefs {
 
  Function<MethodRefs, String> f = MethodRefs::getValueStatic;

  public static String getValueStatic(MethodRefs smt) {
    return smt.getValue();
  }
  ...
}
andThen metodu
İki tane Function nesnesini birleştirir. Önce ilk Function çalışır ve daha sonra ikinci Function çalışır.

Örnek
Şöyle yaparız
Function<Double, Double> f1 = price -> price * 0.8;

Function<Double, String> f2 = price ->String.format("Discounted Price : %s ", price);

Function<Double, String> getDiscountedPriceTag = f1.andThen(f2);

var discountedPrice = getDiscountedPriceTag.apply(100.0);//Discounted Price : 80.0
identity metodu
Girdi parametresini aynen döner.
Örnek
Şöyle yaparız.
Map<Integer,Foo> myMap = 
    fooList.stream().collect(Collectors.toMap(Foo::getId, Function.identity()));
Örnek
Elimizde bir Foo seti olsun.
Set<Foo> set = ...;
Bu seti Map'e çevirmek istiyoruz. key olarak nesnenin hashCode alanını, value olarak nesnenin kendisini kullanmak istiyoruz. Şöyle yaparız.
Map<Integer, Foo> map = list.stream()
                            .collect(Collectors.toMap(
                                Object::hashCode, 
                                Function.identity()));
Örnek - frequency map
Elimizde sayılar barındıran bir liste olsun.
List<Integer> numbers = ...;
Bu listeyi frekans map'ine çevirmek için şöyle yaparız.
Map<Integer, Long> countFrequencies = numbers.stream()
  .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));
Örnek - frequency map
Person sınıfının equals() ve hashCode() metodları olduğunu varsayalım. Şöyle yaparız
List<Person> people = Arrays.asList(new Person("Steve"), new Person("Steve"),
  new Person("Ben"), new Person("Ben"), new Person("Steve"),
  new Person("Steve"));

Map<Person, Long> map = people.stream()
  .collect(Collectors.groupingBy(Function.identity(), Collectors.counting()));

Hiç yorum yok:

Yorum Gönder