Merhaba arkadaşlar, bu yazımda Java 8 ile gelen yenilikleri anlatacağım. Konuları örnekler üzerinden anlatacağım. Aşağıdaki ana başlıklar içerisinde inceleyebiliriz;
- Lambda Expressions
- Default Ve Static Metotlar
- Java Stream API
- Java Time API
- Functional Interfaces
- Optional Class
Lambda Expressions
Lambda expression, java object oriented dünyasında fonksiyonel programlamayı (functional programming) görselleştirmemizin(visualize) yoludur. Java programlama dilinin temeli nesnelerdir ve object olmadan asla bir fonksiyona sahip olamayız, bu yüzden java dili lambda ifadelerinin sadece fonksiyonel arayüzlerle(functional interfaces)kullanılmasına destek sağlar. Lambda expression, kod sayısını azaltır ve kod okunabilirliğini sağlar.
Syntax: (argument) -> (body)
Örnek kullanım; (x,y) -> x+y
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
package com.abdullahfurkan.lambdaexpressions; import java.util.ArrayList; public class Test { public static void main(String[] args) { ArrayList<Integer> numbers = new ArrayList<Integer>(); numbers.add(5); numbers.add(9); numbers.add(8); numbers.add(1); numbers.forEach((n) -> { System.out.println(n); }); } } |
Çıktı:
Default Ve Static Metotlar
Java8 den önce interfaceler de sadece gövdesiz metotlar tanımlanabiliyordu. Ancak Java8 ile bu durum değişti ve default metotlar çıktı. Default metot ile interface içerisinde metodun gövdesi yazılabiliyor. Default metotlar override edilebilirler.
Static metotlar ise, gövdeleri interface içerisinde tanımlanır ancak override edilemezler. Aşağıdaki örnek incelenebilir:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
public interface SelamInterface { int topla(int a, int b); default void yaz(String deger) { System.out.println("Değer yazdırıldı : " + deger); } static int cikar(int a, int b) { return a - b; } } public class SelamInterfaceImpl implements SelamInterface { @Override public int topla(int a, int b) { return a + b; } /* @Override public void yaz(String deger2) { System.out.println("Deger2 yazdırıldı : " + deger2); } */ } public class Test { public static void main(String[] args) { SelamInterfaceImpl interface1=new SelamInterfaceImpl(); interface1.topla(4, 5); interface1.yaz("Furkan KOC"); } } |
Çıktı:
Stream API
Stream API, java da veri yığınlarında işlem yapmayı kolaylaştırmayı sağlamaktadır. Veri yığınları olarak Collections,diziler vb. söylenebilir. Yani Stream API, dizilerde ve listelerde işlem yapmayı kolaylaştırmaktadır.
Örnek olarak aşağıdaki kod parçalarına ve çıktılara bakalım:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class Test { public static void main(String[] args) { List<String> nameList = new ArrayList<String>(); for (int i = 0; i < 10; i++) nameList.add("Furkan" + i); nameList.stream().forEach(System.out::println); List result = nameList.stream().sorted((x1, x2) -> x1.compareTo(x2)).collect(Collectors.toList()); System.out.println(result); } } |
Çıktı:
Java Time API
Java da var olan tarih işlemlerinin üzerine gelen yenilikleri barındırır. Gelen yenilikler iki tane sınıf özelinde geliştirilmiştir. Bu sınıflar;
- util.Date
- util.Calendar
Bu sınıfların dezavantajlarını karşılamak için geliştirilmiş bir API’dir. Bu yeni gelen API java.time paketi içerisinde bulunur. Bu paket içerisinde bulunan sınıflardan bazıları;
- LocalDate
- LocalTime
- LocalDateTime
- ZonedDate
- DateTımeFormatter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
package com.abdullahfurkan.javatimeapi; import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; import java.time.Month; import java.time.format.DateTimeFormatter; public class Test { public static void main(String[] args) { // Mevcut tarih LocalDate date = LocalDate.now(); System.out.println("the current date is " + date); // Mevcut zaman LocalTime time = LocalTime.now(); System.out.println("the current time is " + time); // Şu anki tarihi ve zamanı verecek. LocalDateTime current = LocalDateTime.now(); System.out.println("current date and time : " + current); // Belirli bir formatta yazdırmak için DateTimeFormatter format = DateTimeFormatter.ofPattern("dd-MM-yyyy HH:mm:ss"); String formatedDateTime = current.format(format); System.out.println("in formatted manner " + formatedDateTime); // Ay, gün ve saniyeleri yazdırırır. Month month = current.getMonth(); int day = current.getDayOfMonth(); int seconds = current.getSecond(); System.out.println("Month : " + month + " day : " + day + " seconds : " + seconds); // Belirli bir tarihi yazdırır. LocalDate date2 = LocalDate.of(1950, 1, 26); System.out.println("the republic day :" + date2); // mevcut saatle tarih yazdırılıyor. LocalDateTime specificDate = current.withDayOfMonth(24).withYear(2016); System.out.println("specific date with " + "current time : " + specificDate); } } |
Functional Interfaces
İçerisine yalnızca bir adet abstract metod bulunan interfacelerdir. Eğer interface içerisinde tek bir adet metod bulunuyor ve bu metod da abstract metod ise Functional Interfaces olmuş olur. Bu yenilik Lambda Expressionların kullanılabilmesi için tanımlanır. Functional Interfaces, tanımlanırken @FunctionalInterface notasyonu kullanılır. Ancak bu notasyon zorunlu değildir validasyon yapmak amacıyla kullanılır. Eğer notasyon eklenir ancak birden fazla abstract metot tanımlanırsa compile error verecektir.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package com.abdullahfurkan.functionalinterfaces; @FunctionalInterface public interface Sayable { //abstract method void say(String msg); // Herhangi bir Object sınıfı metotlarını içerebilir. String toString(); int hashCode(); boolean equals(Object obj); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 |
package com.abdullahfurkan.functionalinterfaces; public class Test implements Sayable{ public void say(String msg) { System.out.println(msg); } public static void main(String[] args) { Test test=new Test(); test.say("abdullahfurkankoc.com functional interface"); } } |
Çıktı:
Optional Class
Geliştiricinin karşılaşmış olduğu NullPointerException hatalarını önleyebilmek için çıkarılmıştır. Java.util.Optional sınıfı toplamda 15 adet metot bulundurmaktadır. Ufak bir örnek ile konuyu pekiştirelim:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
package com.abdullahfurkan.optional; import java.util.Optional; public class Test { public static void main(String[] args) { String[] str = new String[10]; str[5] = "JAVA OPTIONAL CLASS EXAMPLE"; // 5. indexe set edildi. Optional<String> empty = Optional.empty(); // Optional classın boş instance döndürür. System.out.println(empty); Optional<String> value = Optional.of(str[5]); // Boş olmayan Optional döner. System.out.println("Filtered value: " + value.filter((s) -> s.equals("Abc"))); // Eger değer varsa Optional döner, diğer durumlarda empty döner. System.out.println("Filtered value: " + value.filter((s) -> s.equals("JAVA OPTIONAL CLASS EXAMPLE"))); System.out.println("Getting value: " + value.get()); //Varsa Optional döner, yoksa NoSuchElementException fırlatır. System.out.println("Getting hashCode: " + value.hashCode()); // Değerin hashCode döndürür. System.out.println("Is value present: " + value.isPresent()); // Eğer varsa true döner, diğer durumlarda false döner. System.out.println("Nullable Optional: " + Optional.ofNullable(str[5])); // Eğer varsa boş olmayan Optional döner, diğer durumlarda Optional empty döner System.out.println("orElse: " + value.orElse("Value is not present")); // Varsa değeri döndürür, yoksa belirtilen değeri döndürür. System.out.println("orElse: " + empty.orElse("Value is not present")); value.ifPresent(System.out::println); // Metot referansı kullanarak değeri basar. } } |
Bu yazımı burada bitiriyorum. Diğer yazılarda görüşmek üzere..