Professional Documents
Culture Documents
Java8 Ebook
Java8 Ebook
Rahman Usta
indekiler
nsz ......................................................................................................................... xi
1. Lambda Expression nedir? Nasl kullanrm? ............................................................. 1
1.1. Lambda nedir? .............................................................................................. 1
1.2. Javascript ile Lambda Basit Giri ................................................................ 1
1.3. Lambda Java 8 ncesinde nasld? ................................................................ 2
1.4. Java 8 ve Lambda ifadeleri ............................................................................ 3
2. Lambda ifadeleri ve Fonksiyonel arayzler ................................................................ 5
2.1. Functional Interfaces ..................................................................................... 5
3. Tarih ve Saat ilemleri ............................................................................................. 9
3.1. LocalDate ..................................................................................................... 9
3.2. LocalTime ................................................................................................... 10
3.3. LocalDateTime ............................................................................................ 11
3.4. ZoneId ........................................................................................................ 12
3.5. ZonedDateTime ........................................................................................... 13
4. Consumer Arayz ................................................................................................. 15
4.1. Java 8 ncesi .............................................................................................
4.2. Java 8 sonras ............................................................................................
4.3. Lambda deyimleri aklldr ............................................................................
4.4. Consumer arayz nerede kullanlyor? ........................................................
4.5. Lambda deyimlerini Metod Referanslar ile kullanabiliriz. ................................
5. Lambda rnekleri ...................................................................................................
5.1. Consumer Arayz ......................................................................................
5.2. BiConsumer Arayz ...................................................................................
5.3. Function Arayz ........................................................................................
5.4. UnaryOperator Arayz ...............................................................................
5.5. BiFunction Arayz .....................................................................................
5.6. BinaryOperator Arayz ...............................................................................
5.7. Predicate Arayz .......................................................................................
5.8. BiPredicate Arayz ....................................................................................
5.9. Supplier Arayz .........................................................................................
6. Notasyonlar ve Tekrarl Notasyonlar ........................................................................
6.1. Notasyonlar ve Alanlar ................................................................................
15
16
16
17
17
19
19
19
20
20
21
21
21
22
22
25
27
28
29
31
32
iii
Java 8 Ebook
37
37
39
41
42
45
46
46
47
48
48
48
49
49
50
50
50
51
52
53
54
56
57
59
59
61
61
62
63
63
64
65
65
65
66
66
69
71
iv
Java 8 Ebook
101
102
103
105
nsz
Java 8 ve yeniliklerini ieren bu kitap ile, Java programlama dilinin en yeni zelliklerini
renebilirsiniz.
Java 8 Ebook kodcu.com
iermektedir.
1
http://kodcu.com
2
http://kodcu.com/author/rahmanusta/
xi
(1)
console.log("Eleman: ",e);
});
Yukarda (1) numaral ksmdaki anonim fonksiyon yani lambda fonksiyonu, forEach
metodu ierisinde koturulmaktadr. forEach metodu ierisindeki benzer yaklam, kendi
fonksiyonumuz ile oluturalm.
Lambda Java 8
ncesinde nasld?
var fonk= function(a,b,callback){
// Lambda fonksiyonu "callback" burada koturulur.
return callback(a,b)*2; //
(2)
}
var result = fonk(2,3,function(a,b){ // (1)
// Bu Lambda fonksiyonu 2 argman toplar.
return a+b;
});
console.log("Sonu ..: ",result); // Sonu : (2+3)*2 = 10
Tekrar ederek, Lambda fonksiyonlar iin referans verilebilir i birimleri denebilir. Bu yaklam
bir ok programlama dilinde farkl biimlerde yer alabilir, anlalabilirlik asndan ilk nce
Javascript rnei vermeyi tercih ettim.
Anonim arayz szlemesi, int trnden 2 deer alr ve bir int deer dndrr. Dikkat
ederseniz sadece szlemenin maddesi tanmland, i mant anonim olarak gelitirici
tarafndan tanmlanacak.
public class LambdaApp {
public static void main(String[] args) {
LambdaApp app = new LambdaApp();
// rnek 2 (1) gibi
app.fonk(2, 3, new Anonim() {
@Override
public int call(int a, int b) {
return a + b;
}
});
}
// rnek 2 (2) gibi
public int fonk(int a, int b, Anonim anonim) {
return anonim.call(a, b) * 2;
};
Grld zere tek bir satrda ayn ii gren anonim i birimini yani lambda ifadesini yazdk.
Ayn rnei imdi Java 8 Lambda deyimi ile yazalm.
public interface Anonim{
public int call(int a, int b);
}
public class LambdaAppJava8 {
public int fonk(int a, int b, Anonim anonim) {
return anonim.call(a, b) * 2;
};
public static void main(String[] args) {
Grld zere 6 satrlk anonim snf kullanmn, tek satra drm olduk.
1
Lambda ifadeleri, Java 8 versiyonunun en arpc yeniliklerinden biri. (Bkz. Project Lambda ).
Sizler de Java 8 kullanmak istiyorsanz https://jdk8.java.net/ adresinden sisteminize
kurabilirsiniz.
Bol Javal gnler dilerim.
http://openjdk.java.net/projects/lambda/
Bu Labmda deyimini rnein Javascript gibi bir dil ile temsil etmek isteseydik yle yazabilirdik;
function(x , y) {
return 2*x+y;
}
Peki fn(x,y) 2*x + y Lambda ifadesini Java programlama dilinde nasl yazabiliriz?
Java 8 gelitirilirken, gelitirim takm kendilerine bu soruyu sormu ve yant olarak fonksiyonel
arayzler kullanarak ihtiyac karlamlar.
yle ki; Bir Lambda ifadesi, Java derleyicisi tarafndan, bir Java arayznn (tek bir soyut
metodu olmal) nesnel karlna (implementation) dntrlmektedir.
rnein, fn(x,y) 2*x + y Lambda ifadesi, aadaki fonksiyonel arayze
dntrlebilirdir. nk fonksiyon x ve y adnda iki parametre almakta ve 2*x + y ile tek bir
Functional Interfaces
deer dndrmektedir. Tabi burada x ve y nin tipleri ne? dersek, herhangi bir matematiksel
tip olabilir. Biz burada sabit bir tip (int gibi) verebilir, veya jenerik tiplemeler de yapabiliriz. Fakat
u anlk bununla yetinelim.
@FunctionalInterface // Opsiyonel
interface Foo{
int apply(int x, int y);
}
rnek 2:
Lambda ifadeleri, metod parametrelerinde de tanmlanabilir.
class Bar{
public int calculate(Foo foo, int x, int y){
return foo.apply(x,y);
}
}
Bar bar = new Bar();
Functional Interfaces
Java programlama dilinde fonksiyon ifadesi pek kullanlmaz, onun yerine metod ifadesi
kullanlr. Java metodlar tek bana birer eleman deildir, dier bir dil elemannn (snf,
enum, interface ..) dahilinde tanmlanrlar. Javascript gibi dillerde ise fonksiyonlar tek bana
birer elemandr, dier bir dil elemannn iinde olmak zorunluluu yoktur. Bu sebeple
Java ortamnda, bir Lambda ifadesinden bir fonksiyona/metoda/i birimine dnm iin
fonksiyonel arayzler kullanlmaktadr.
Tekrar grmek dileiyle..
3.1. LocalDate
LocalDate snf ile tarihsel zaman temsil edilir. rnein: 10/10/2010 tarihini LocalDate
ile temsil edebiliriz.
rnekler
"of" metodu ile LocalDate nesnesi oluturulabilir.
LocalDate.of(1988, 07, 16); // 1988-07-16
LocalDate.of(1988, Month.JULY, 16) // 1988-07-16 (Month enum)
"with*" metodu ile eldeki bir LocalDate iin gn, ay, yl alanlar dzenlenebilir. LocalDate
snf immutable dir. Bu sebeple with metodu farkl bir LocalDate nesne dndrr. O anki
nesneyi dzenlemez.
LocalTime
"plus*" metodu ile eldeki bir LocalDate iin gn, ay, yl alanlar artrlabilir. LocalDate snf
immutabledir. Bu sebeple plus metodu farkl bir LocalDate nesne dndrr. O anki nesneyi
dzenlemez.
now
.plusWeeks(2)
.plusDays(3)
.plusYears(3)
.plusDays(7); //
now
.plus(2, ChronoUnit.WEEKS)
.plus(3, ChronoUnit.YEARS)
.plus(3, ChronoUnit.DECADES); //
3.2. LocalTime
LocalTime snf ile saatsel zaman temsil edilir. rnein: 20:11 , 18:15:55 saatlerini
LocalTime ile temsil edebiliriz. LocalTime ile saat, dakika, saniye, salise temsil edilebilir.
rnekler
10
LocalDateTime
3.3. LocalDateTime
LocalDateTime snf ile hem tarihsel hem saatsel zaman temsil edilir. rnein: 10/10/2010
15:22:33 zamann LocalDateTime ile snfsal olarak temsil edebiliriz.
rnekler
LocalDateTime now = LocalDateTime.now();
LocalDateTime dateTime =
LocalDateTime.of(2014, Month.JANUARY, 3, 4, 5, 45);
dateTime.getYear(); // 2014
dateTime.getMonth(); // JANUARY
dateTime.getDayOfMonth(); // 3
dateTime.getHour(); // 4
dateTime.getMinute(); // 5
dateTime.getSecond(); // 45
// LocalDateTime2LocalDate ve LocalDateTime2LocalTime
LocalDate date = dateTime.toLocalDate();
LocalTime time = dateTime.toLocalTime();
dateTime
.minusDays(3)
.plusYears(3)
.plusMinutes(3)
11
ZoneId
.minusWeeks(5)
.plusSeconds(2)
.plus(3, ChronoUnit.DECADES)
.minus(3, ChronoUnit.DECADES);
3.4. ZoneId
ZoneId snf, dnya zerindeki saat dilimlerinin Java tarafl nesnel karln temsil iin
oluturulan yeni bir Java 8 bileenidir.
Java 8 iin tm saat dilimlerinin listelenmesi iin ZoneId snfnn getAvailableZoneIds
metodu kullanlabilmektedir. rnein aadaki kod, tm saat dilimlerini sral olarak
listelemektedir.
Set<String> zones = ZoneId.getAvailableZoneIds();
zones.stream().sorted().forEach(System.out::println);
Africa/Abidjan
Africa/Accra
Africa/Addis_Ababa
America/Argentina/Tucuman
America/Argentina/Ushuaia
America/Aruba
America/Asuncion
Asia/Istanbul
Asia/Jakarta
Asia/Jayapura
Etc/GMT+12
Etc/GMT+2
Etc/GMT+3
Europe/Isle_of_Man
Europe/Istanbul
Europe/Jersey
O anki allan makinadaki saat dilimi iin ZoneId snfnn systemDefault metodu
kullanlabilir.
12
ZonedDateTime
ZoneId.systemDefault(); // Europe/Athens
JVM varsaylan saat dilimini mevcut iletim sistemi zerinden almaktadr. Eer istenirse
mevcut Java sanal makinesinin varsaylan saat dilimi -Duser.timezone=<Time Zone>
ifadesiyle dzenlenebilmektedir.
-Duser.timezone=Europe/Istanbul
gibi.
3.5. ZonedDateTime
ZonedDateTime snf aslnda saat dilimi kattrlm LocalDateTime snfdr desek yeridir.
LocalDateTime snfndan fark genel olarak temsil ettii zaman saat dilimi ierir olarak
sunmasdr.
rnekler
ZonedDateTime.now();
/* 2014-04-05T16:33:16.320+03:00[Europe/Athens] */
ZoneId istanbul = ZoneId.of("Europe/Istanbul");
ZonedDateTime.now(istanbul);
// 2014-04-05T16:33:16.330+03:00[Europe/Istanbul]
// Japonyada tarih/saat ka?
ZonedDateTime.now(ZoneId.of("Japan"));
// 2014-04-05T22:33:16.331+09:00[Japan]
LocalDate
ve
LocalTime
Kaynaklar
[1] http://www.threeten.org/ [2] http://java.dzone.com/articles/introducing-new-date-and-time
[3] http://docs.oracle.com/javase/tutorial/datetime/index.html
13
ZonedDateTime
14
Consumer arayz, yukarda grld zere bir fonksiyonel arayzdr. Bir arayzn,
fonksiyonel olarak nitelenebilmesi iin, tek bir soyut metoda sahip olma art vardr. Zaten bu
sayede, fonksiyonel arayzler Lambda deyimlerine yknebilmektedirler.
http://docs.oracle.com/javase/8/docs/api/java/util/function/package-summary.html
15
Java 8 sonras
}
};
consumer.accept("Merhaba Dnya");
Lambda deyimlerinde odaklanmas gereken nokta, fonksiyonel arayzn tek metodunun sahip
olduu metod girdi tipi, says,sras ve metod kt tipidir. Bu sayede kod satr olarak tasaruf
edilmektedir.
Grld gibi, (String msg) tanmlamasn (msg) yapabildik. Sol tarafta zaten String tip bilgisi
yer aldndan, compiler metod girdisinin tipini buradan elde edecektir. Tip tanmlamalarndan
feragat ettiimiz gibi parantezden de kurtulabiliriz.
Consumer<String> consumer = e -> {
System.out.println(e);
};
16
Consumer arayz
nerede kullanlyor?
consumer.accept("Merhaba Urans");
forEach metodu, nce null kontrol yapmakta ve ardndan, dngsel olarak mevcut veri tipi
zerinde veri tketimi yapmaktadr. imdi bu metodu kullanan basit bir rnek yazalm.
List<String> names = Arrays.asList("Ali", "Veli", "Selami");
names.forEach(consumer);
// veya
names.forEach(e -> {
System.out.println(e);
});
Bu rnek ierisinde her bir isim bilgisi tek tek konsol ekranna ktlanmaktadr.
17
App#listele metodunun bir benzerinin yazlm zaten PrintStream snf ierisinde var.
List<String> names = Arrays.asList("Ali", "Veli", "Selami");
names.forEach(System.out::print);
// veya
names.forEach(System.out::println);
18
T tipindeki parametreyi alr ve tketir/iler. Geriye deer dndrmez (void). T burada herhangi
bir snf tipi olabilir.
Consumer Arayz rnek
Consumer<String> consumer = word -> {
System.out.println(word); // Merhaba Dnya
};
consumer.accept("Merhaba Dnya");
19
Function Arayz
Function trndendir. Eer T ve R tipleri ayn trden ise, ismi UnaryOperator olur.
UnaryOperator Arayz rnek
UnaryOperator<Integer> unaryOperator = a -> Math.pow(a,5);
Integer result = unaryOperator.apply(2);
System.out.println(result); // 32
20
BiFunction Arayz
T ve U tiplerinde iki parametre alr, R tipinde deer dndrr. T, U ve R herhangi bir snf tipi
olabilir. Function#apply tek parametre alrken Bi* iki parametre alr.
BiFunction Arayz rnek
BiFunction<Integer, Integer, String> biFunction = (a, b) -> "Sonu:" + (a + b);
String result = biFunction.apply(3,5);
System.out.println(result); // Sonu: 8
21
BiPredicate Arayz
T tipimde bir parametre alr, arta bal olarak true/false deer dndrr.
Predicate Arayz rnek
Predicate<Integer> predicate = a -> (a > 0);
boolean pos = predicate.test(5); // true
boolean neg = predicate.test(-5); // false
Hi parametre almaz, T tipinde bir deer dndrr. Factory pattern iin uygundur.
22
Supplier Arayz
23
24
balayan
arayzlerdir
ve
notasyonlar
iinde
alanlar
rnein;
@Single Notasyonu
public @interface Single {
String value();
}
Aklama
TYPE
METHOD
Metod balarna
FIELD
PARAMETER
Metod parametrelerine
CONSTRUCTOR
Constructor bana
ANNOTATION_TYPE
Notasyonlarn bana
PACKAGE
25
rnek 2
@Target({ElementType.METHOD,ElementType.TYPE})
public @interface Single {
String value();
}
imdi ise @Single notasyonu hem metod balarna hem de snf, arayz, soyut snf gibi
bileenlerin balarna eklenebilir.
Uygulama 2
@Single // Artk buraya da konabilir
public class App {
@Single // Buraya uygulanamaz :(
String message = "Merhaba Dnya";
@Single // Buraya konabilir
public void doIt() {
26
Notasyonlar ve Alanlar
}
}
@Target notasyonu ile yaplan aslnda, notasyonun uygulanabilirlik alann, yani yetki
alann belirlemektir. rnein Uygulama 2'de uygulanabilirlik alan olarak METHOD ve
TYPE belirlenmitir. Bu sebeple sadece bununla ilgili ksmlara @Single notasyonu
uygulanabilir.Mesela rnekte olduu gibi global alanlara uygulanamaz. Eer buraya da
uygulanabilir olmas istenirse FIELD enum bileeni @Target notasyonuna eklenmelidir.
Notasyonlar iin value alannn zel bir anlam vardr. Eer baka bir alana deer atamas
yaplmayacaksa value yazlmasa bile bu deer atamas value alanna yaplmaktadr.
rnein;
@Single("Merhaba Dnya")
27
Notasyonlara Eriim
28
Notasyonlarn
Tekrarl Kullanlmas
rnein @Single notasyonu yukardaki gibi ayn alanda kullanlamaz. Bu snrllk Java 8
ncesinde ikincil bir notasyon zerinden almaktayd.
rnein;
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Multiple {
Single[] value();
}
Multiple notasyonu Single tipli diziler barndrabilen bir value alanna sahiptir. Artk
Multiple notasyonu zerinden birden fazla @Single notasyonu uygulanabilirdir.
Doru kullanm rnei;
@Multiple(value = {
@Single("Merhaba"),
@Single("Jupiter")
})
public class App {
NOTE : Notasyonlarda dizi tipli alanlara atamamalar, { } arasnda virgl , ile ayrlm olarak
yaplmaktadr.
Java 8 ile birlikte bu snrllk ortadan kalkmtr. Bu snrll ortadan kaldrmak iin
@Repeatable notasyonundan faydalanlmaktadr.
29
Notasyonlarn
Tekrarl Kullanlmas
@Repeatable(Multiple.class) // Dikkat
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface Single {
String value();
}
30
Lambda ifadeleri yazarken metod girdi ve ktsna odaklandmza gre, lambda deyimiyle
birebir rten metodlar, lambda deyimleri yerine kullanabilir miyiz? Bunu aadaki metod
zerinden dnelim.
public void herhangiBirMetod(String e){
}
31
Statik olmayan metodlarda Statik olmayan metodlar nesneye ait bileenlerdir. Bu sebeple
nesnenin referans zerinden eriilmelidirler.
rnein;
Consumer<String> consumerWithMetRef = <ObjectRef>::herhangiBirMetod;
32
Lambda ifadesi, satr says baznda kodu iyice ksaltt. imdi bu ayn ii metod referans
kullanarak yapalm.
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);
}
33
rnek 2 Collections#sort metodu ile bir dizi nesneyi sralamak istiyoruz diyelim.
Bu sralamay, metodun 2. parametresinde Comparator trnden 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;
}
});
Fonksiyonel
olarak
Comparator
arayz
java.util.BiFunction arayz birebir ayndr.
ve
imdi anonim olarak oluturulan Comparator trnden nesneyi Lambda ifadeleriyle yeniden
yazalm.
List<Integer> numbers = Arrays.asList(5, 10, 1, 5, 6);
Collections.sort(numbers, (o1, o2) -> o1 - o2)
34
35
36
37
alyor..");
}
void dur(); // Soyut metod
}
rnein yukarda yer alan Minibus snf Arac`arayz trnden bir snftr.
Bu sebeple, Minibus snf trnden nesneler `Arac arayz ierisindeki
gazla() metodunu koturabilecektir.
Minibus minibus=new Minibus();
minibus.gazla();
minibus.dur();
38
Varsaylan
metodlarda akma
Yukarda grld zere, normalde Minibus snf ierisinde gazla()
bulunmamasna ramen, Arac arayz iindeki defender metodu koturabildi.
metodu
alyor..");
}
void dur();
}
public interface Tasit {
default void gazla(){
System.out.println("Tat: alyor..");
}
}
rnein (1) numarada Arac , (2) numarada da Tasit arayzleri gazla() adnda
varsaylan metodlara sahiptir.
imdi bu iki tr birden uygulayan bir Otobus snf yazalm.
akma durumu rnei
public class Otobus implements Arac, Tasit {
@Override
public void dur() {
System.out.println("Ara duruyor..");
}
}
39
Varsaylan
metodlarda akma
Error:(6, 8) java: class com.kodcu.def.Otobus inherits unrelated defaults for
gazla() from types com.kodcu.def.Arac and com.kodcu.def.Tasit
nk ortada Otobus snfnn hangi gazla() metodunu koturacana dair bir ikilem
vardr. JVM ikilem durumlarn hi sevmez, ona bir seim ansz sunmalyz. Bu akma
durumu, varsaylan metodu Otobus snf iinde yeniden dzenlenerek ( @Override ederek)
giderilebilmektedir.
akma durumunun giderilmesi - 1
public class Otobus implements Arac, Tasit {
@Override
public void dur() {
System.out.println("Ara duruyor..");
}
@Override
public void gazla() {
System.out.println("Otobs alyor..");
}
}
40
Varsaylan metodlar ve
Fonksiyonel arayzler
Arac.super.gazla();
/* veya */
Tasit.super.gazla();
}
}
alyor..");
}
void dur();
}
41
otobus.dur();
Ara: alyor..
Otobs duruyor..
Yukarda (1) numarada yazl Lambda deyimi, dur() metoduna karlk olarak tanmlanmtr.
Bu sebeple Arac arayz trnden bir nesne oluturmaktadr.
42
kullanlmaktadr.
43
44
Aklama
filter
Filtreleme
forEach
iterasyon
map
Dntrme
reduce
ndirgeme
distinct
Tekilletirme
sorted
Sralama
limit
Aralk alma
collect
Tre dnm
count
Sayma
45
Stream nesnesi
nasl elde edilir?
IntStream flatMapToInt(Function<? super T, ? extends IntStream> mapper);
LongStream flatMapToLong(Function<? super T, ? extends LongStream> mapper);
DoubleStream flatMapToDouble(Function<? super T, ? extends DoubleStream>
mapper);
Stream<T> distinct();
Stream<T> sorted();
Stream<T> sorted(Comparator<? super T> comparator);
Stream<T> peek(Consumer<? super T> action);
Stream<T> limit(long maxSize);
Stream<T> skip(long n);
void forEach(Consumer<? super T> action);
void forEachOrdered(Consumer<? super T> action);
Object[] toArray();
<A> A[] toArray(IntFunction<A[]> generator);
T reduce(T identity, BinaryOperator<T> accumulator);
Optional<T> reduce(BinaryOperator<T> accumulator);
<U> U reduce(U identity,
BiFunction<U, ? super T, U> accumulator,
BinaryOperator<U> combiner);
<R> R collect(Supplier<R> supplier,
BiConsumer<R, ? super T> accumulator,
BiConsumer<R, R> combiner);
<R, A> R collect(Collector<? super T, A, R> collector);
Optional<T> min(Comparator<? super T> comparator);
Optional<T> max(Comparator<? super T> comparator);
long count();
boolean anyMatch(Predicate<? super T> predicate);
boolean allMatch(Predicate<? super T> predicate);
boolean noneMatch(Predicate<? super T> predicate);
Optional<T> findFirst();
Optional<T> findAny();
}
46
...
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
default Stream<E> parallelStream() {
return StreamSupport.stream(spliterator(), true);
}
...
}
stream() metodu ile elde edilen Stream nesnesi yapaca ilemleri ardl olarak yaparken,
parallelStream() metoduyla elde edilen Stream nesnesi, baz operasyonlar paralel olarak
koturabilmektedir.
rnein;
List<String> names = Arrays.asList("Ali","Veli","Selami");
Stream<String> stream = names.stream();
Stream<String> parallelStream = names.parallelStream();
47
IntStream, DoubleStream,
LongStream ile
9.2.1. forEach
Stream ierisindeki ynsal veriyi tek tek tketmek iin yaplandrlmtr. Consumer arayz
trnden bir parametre bekler.
List<String> names =
Arrays.asList("Ali","Veli","Selami","Cem","Zeynel","Can","Hseyin");
Stream<String> stream = names.stream();
stream.forEach(name -> {
48
filter
System.out.println(name);
});
// veya stream.forEach(System.out::println);
9.2.2. filter
Stream ierisindeki ynsal veri zerinde szme ilemi yapar. Predicate arayz trnden bir
parametre ile filtreleme ilemini yapar.
List<String> names =
Arrays.asList("Ali", "Veli", "Selami", "Cem", "Zeynel", "Can", "Hseyin");
Stream<String> stream = names.stream();
Predicate<String> predicate = name -> name.length() < 4;
Stream<String> filtered = stream.filter(predicate);
filtered.forEach(System.out::println);
9.2.3. distinct
Bir Stream ierisinden tekrarl veriler karlmak isteniyorsa distinct metodundan
faydalanlabilir.
49
sorted
IntStream nesnesi
[1,2,3,5,8,13]
9.2.4. sorted
Stream ierisindeki ynsal verinin sralanm Stream nesnesini dndrr.
IntStream nesnesi
[1,1,2,3,5,8,8,13,13]
9.2.5. limit
Bir Stream yn ierisindeki ilk N veri barndran yeni bir Stream nesnesi sunmaktadr.
9.2.6. count
Stream ierisindeki eleman saysn hesaplar.
50
collect
9
10
9.2.7. collect
Stream trnden nesneler, yn verileri temsil eden zel nesnelerdir. Fakat Stream biimi bir
veri yaps sunmamaktadr. collect metodu arlkl olarak , Stream nesnelerini baka biimdeki
bir nesneye, veri yapsna dntrmek iin kullanlmaktadr.
Stream#collect metodu Collector trnden bir parametre kabul etmektedir. Bu parametre
ile istendik tre dnm salanmaktadr. Collector trnden arayzler, Collectors
snfnn eitli statik metodlaryla elde edilebilmektedir.
List<String> names =
Arrays.asList("Ali", "Veli", "Selami", "Veli", "Selami", "Can", "Hseyin");
List<String> list = names.stream().collect(Collectors.toList());
Set<String> set = names.stream().collect(Collectors.toSet());
Long count = names.stream().collect(Collectors.counting());
String collect = names.stream().collect(Collectors.joining(" - "));
Map<Integer, List<String>> integerListMap =
names.stream().collect(Collectors.groupingBy(name -> name.length()));
51
map
Value
Ali
Can
Veli
Veli
Selami
Selami
7
Hseyin
9.2.8. map
Stream iindeki ynsal olarak bulunan her bir veriyi dntrmeye olanak tanr. Dntrm
ilemi Stream ierisindeki her bir e iin ayr ayr yaplmaktadr. Stream#map metodu
Function trnden bir parametre beklemektedir.
rnek 1; Bir List<String> iindeki her bir enin harflerini bytelim.
List<String> names = Arrays.asList("Ali", "Veli", "Selami", "Cem");
Stream<String> stream = names.stream();
Stream<String> upperStream= stream.map(name -> name.toUpperCase());
List<String> upperNames = upperStream.collect(Collectors.toList());
52
reduce
.rangeClosed(1, 5)
.map(n -> n*n)
.forEach(System.out::println);
9.2.9. reduce
Bir Stream ierisindeki verilerin teker teker ilenmesidir. Teker teker ileme srecinde, bir
nceki admda elde edilen sonu bir sonraki adma girdi olarak sunulmaktadr. Bu sayede
ylml bir hesaplama sreci elde edilmi olmaktadr.
Stream#reduce metodu ilk parametrede identity
BinaryOperator trnden bir nesne kabul etmektedir.
reduce ileminde bir nceki hesaplanm deer ile sradaki deer bir ileme tabi tutulmaktadr.
leme balarken bir nceki deer olmad iin bu deer identity parametresinde
tanmlanmaktadr.
rnek 1; 1,2,3,4,5 saylarnn toplamn hesaplayalm.
int result = IntStream
.of(1, 2, 3, 4, 5)
.reduce(0, (once, sonra) -> {
System.out.format("%d - %d %n", once, sonra);
return once + sonra;
});
nce hesaplanm deeri, Sonra ise sradaki deeri temsil etmektedir. Bir admda kan
hesaplamann sonucu, bir sonraki admda (satrda) nce stununa sunulmaktadr.
53
nce
Sonra
Hesaplama
0+1 #
1+2 #
3+3 #
6+4 #
10
10+5 = 15
54
Person listesi
Stream nesnesi elde ediliyor
Nesnenin ya alanna gre mapping yaplyor.
Integer Double dnm
Ortalamalar hesaplanyor
rnek 2; Person listesinde baz kiilerin ya alanlar null deer iersin. Bu durumda alma
zamannda nullpointerexception istisnas elde edilecektir. Bu gibi bir durumda filtreleme
yapsn ilemimize ekleyebiliriz.
Person p1 = new Person("Ahmet", 12);
Person p2 = new Person("Ali", null);
Person p3 = new Person("Aye", 30);
Person p4 = new Person("Murat", null);
Person p5 = new Person("Zeynep", 60);
List<Person> personList = Arrays.asList(p1, p2, p3, p4, p5);
personList
.stream()
.filter(Objects::nonNull) // Dikkat !!
.map(p -> p.getAge())
.map(Double::valueOf)
55
Parallel Stream
Ayn zamanda bir paralel Stream nesnesinden ardl Stream nesnesi de elde edilebilmektedir.
Bunun iin Stream#sequential metodu kullanlmaktadr.
rnein;
List<Integer> ints = Arrays.asList(1, 3, 5, 7, 9, 11, 13, 15);
Stream<Integer> parallelStream = ints.parallelStream(); // Paralel
Stream<Integer> stream = stream.sequential(); // Ardl
rnek Aada bir dizi saysal ifadeyi filtreleyen, sralayan ve ktlayan bir kod paras
grmekteyiz. Ayrca bu ilemlerin paralel Stream nesnesiyle yaplmak istendiini gryoruz.
56
Bu rnekte filter ve sorted paralel olarak koturulabilirdir. Fakat forEach metodu doas gerei
eleri ardk ktlamaldr. te tam da bu admda elimizdeki paralel Stream nesnesi ardl
Stream nesnesine dntrlmektedir ve ardndan forEach ilemini koturmaktadr.
Yani elimizde paralel Stream nesnesi varsa, bu zincirlemeli ilemin her admnda paralel
koturma yaplaca anlamn tamamaktadr.
rnein yukardaki liste zerinde yaplmak istenen 2 filter ve 1 map ilemi Lazy
ilemlerdir. Kod paras bu haliyle altrldnda ne bir filtreleme ne de bir dntrme
ilemi yaplacaktr. Burada yaplan sadece Stream nesnesini hazrlamaktr. Lazy ilemler
gerekmedike ileme konulmamaktadr.
List<Integer> names = Arrays.asList(1,2,3,6,7,8,9);
Stream<Integer> stream = names
.stream()
.filter(Objects::nonNull)
57
.filter(n->n%2==1)
.map(n->n*2)
stream.forEach(System.out::println); // Dikkat !!
Lazy
Lazy
Lazy
Eager
Fakat bu hazrlanan Stream nesnesi, yukardaki gibi bir Eager operasyonla karlarsa,
nceki zincirlerde biriken Lazy ilemleri de harekete geirecektir. Yani (4) numaradaki ilem,
(1)(2)(3) numaral ilemlerin tetikleyicisi konumundadr.
Tekrar grmek dileiyle..
58
projesiyle, zellikle
Uygulayc ktphane
Ada
JGNAT
BBx
CFML
Adobe ColdFusion
Railo
Open BlueDragon
Common Lisp
JavaScript
Rhino
1
http://openjdk.java.net/projects/mlvm/
2
http://en.wikipedia.org/wiki/Polyglot_(computing)
59
JVM Dilleri
Dil
Uygulayc ktphane
Nashorn
Pascal
Free Pascal
MIDletPascal
Perl 6
Rakudo Perl 6
Prolog
JIProlog
TuProlog
Python
Jython
REXX
NetRexx
Ruby
JRuby
Scheme
Bigloo
Kawa
SISC
JScheme
Tcl
Kaynak: List of JVM languages
Jacl
3
Tablo 10.1, JVM Dilleri Tablosunda listelenen programlama dilleri JVM bnyesinde
koturulabilmektedir. Baz diller yorumlama uslyle koturulurken, bazlar ise bayt koda
dntrldkten sonra koturulmaktadr. Fakat, JavaScript haricindeki dillere karlk bir
uygulayc ktphaneyi projenize eklemeniz gerekmektedir.
rnein JVM zerinde Ruby dili ile uygulama gelitirmek istiyoranz, JRuby bamlln Java
projenize eklemelisiniz.
JRuby Maven Dependency
<dependency>
<groupId>org.jruby</groupId>
<artifactId>jruby</artifactId>
<version>1.7.16</version>
</dependency>
Dier listeli diller iin de benzer biimde gereken bamllk Java projenize eklenmelidir.
3
60
http://en.wikipedia.org/wiki/List_of_JVM_languages
Fakat, JavaScript programlama dili iin olay biraz farkl bir durumda. nk, Java 7
Rhino, Java 8 ise Nashorn isimli JavaScript motorlarn gml olarak JVM ierisinde
bulundurmaktadr. Bu Java ekosisteminin JavaScript diline ne kadar nem verdiini ayrca
gstermektedir.
10.3. ScriptEngine
ScriptEngine trnden nesneler, ScriptEngineManager#getEngineByName metodu
zerinden esiz bir takma isim ile elde edilmektedir. Bu nesneler ile, String trnden
kod bloklar koturulabilmekte, ayrca Java ile iletiim kurulabilmektedir. rnein, Nashorn
JavaScript motoru iin "nashorn" veya "rhino" takma adlar, Ruby iin ise "jruby"
takma ad kullanlmaktadr.
rnein;
...
ScriptEngineManager engineManager = new ScriptEngineManager();
ScriptEngine engine = engineManager.getEngineByName("nashorn");
ScriptEngine engine = engineManager.getEngineByName("rhino");
ScriptEngine engine = engineManager.getEngineByName("jruby");
ScriptEngine engine = engineManager.getEngineByName("jython");
...
http://docs.oracle.com/javase/8/docs/api/javax/script/package-summary.html
61
62
63
#ifPresent - Varsa
yap, yoksa yapma
64
#map - Dntrme
65
#orElseGet - Varsa
al, yoksa ret
Lambda ile
Metod referans ile
66
http://kodcu.com/java-8-ebook/
67
68
69
ekil 12.2. Full JRE > compact 3 > compact 2 > compact 1
rnein gml sisteminizde en temel Java paketlerini kullanacaksanz compact 1 profilini
semek size avantaj salayacaktr. compact 1 profilinde hazrlanan JRE yaklak 9.5
MBdir. Profiller aras boyutsal kyaslamaya dair grafii aada gryoruz.
70
JavaFX Extension
71
Nashorn Extension
72
Java 8 ME vs
Java 8 Embedded
salayan zel bir Java alma ortamdr. Java 8 Me ile gml cihazlarn donanmsal
birimlerini kontrol etmek mmkndr. rnein bir gml cihazn giri/k pinlerini,
Watchdog Timer gibi bileenlerini kullanabilirsiniz. Java ME iinde bunlar kullanabilmek iin
zel paket ve snflar yer almaktadr.
Tekrar grmek dileiyle.
73
74
75
Cevap: Math.sum(5,3) = 8
Java dilinin genel doas gerei bu iki i srasyla iletilecektir. Fakat dikkat edilirse, yaplan iki
i birbirinden tamamen bamszdr. Biri DBden veri ekiyor, dieri ise dosyalama sisteminden
dosya okuyor. Dolaysyla, bu ilerden birinin balamas iin dier iin tamamlanmas
beklenmek zorunda deil.
Bu iki metodun asenkron olarak almas iin geleneksel okilemcikli programlama ile
harici asenkron i kollar oluturulabilir. Fakat, burada geleneksel yntemlerin dnda
CompletableFuture nesnesi zerinden gitmekte fayda gryorum.
public class CompletableFuture<T> implements Future<T>, CompletionStage<T> {
...
}
hale
getirelim.
Bunun
iin
76
CompletableFuture#allOf
Yukardaki (1) ve (2) numaral iler bu noktadan sonra arkaplanda ForkJoin thread havuzu
iinde koturulmu olacak. Bylece (2) numaral i, (1) numaral i koturulmaya balatldktan
hemen sonra almaya balayacak, dierinin ie koyulmasn bloke etmeyecek.
Peki imdi bu iki asenkron grevin tamamlanma sresi ne kadar olacak?
Cevap: Math.max(5,3) = 5
Burada iki i birden hemen hemen ayn anda balayaca iin, iki iin toplamda tamamlanma
sresi yaklak olarak en fazla sren grev kadar olacaktr.
CompletableFuture#join metodu, asenkron olarak koturulan
grev tamamlanana kadar, uygulama aknn mevcut satrda askda
kalmasn salar. Yani (3) ve (4) satrlarndan sonraki satrlarda,
yukardaki iki iin birden tamamlanm olduunu garanti edebiliriz.
13.2. CompletableFuture#allOf
Birden fazla CompletableFuture nesnesini birletirir. Ancak herbir i birden tamamlandnda,
CompletableFuture nesnesi tamamland bilgisine sahip olur.
public static CompletableFuture<Void> allOf(CompletableFuture<?>... cfs) {
...
}
rnein;
77
CompletableFuture#anyOf
Yukarda iki tane asenkron i koturulmaktadr. Bir tanesi 5, dieri ise 15 saniye srmektedir.
Eer asenkron koan uygulama aknda, bu iki i bitene kadar bir noktada beklemek
istiyorsak, CompletableFuture#allOf dan faydalanabiliriz. Uygulama aknn askda
bekletilmesi ise CompletableFuture#join metodu ile salanmaktadr.
kt
Bir arada iki derede. // 0. saniyede
lk grev tamamland.. // 5. saniyede
Dier grev tamamland.. // 15. saniyede
Bitti. // 15. saniyede
13.3. CompletableFuture#anyOf
Birden fazla CompletableFuture nesnesini birletirir. Herhangi bir grev tamamlandnda,
CompletableFuture nesnesi tamamland bilgisine sahip olur.
rnein;
CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> {
78
CompletableFuture#supplyAsync
...
Thread.sleep(5000);
...
System.out.println("lk grev tamamland..");
});
CompletableFuture<Void> future2 = CompletableFuture.runAsync(() -> {
...
Thread.sleep(15000);
...
System.out.println("Dier grev tamamland..");
});
CompletableFuture<Void> anyOf = CompletableFuture.anyOf(future1, future2);
System.out.println("Bir arada iki derede.");
anyOf.join();
System.out.println("Bitti.");
kt
Bir arada iki derede. // 0. saniyede
lk grev tamamland.. // 5. saniyede
Bitti. // 5. saniyede
Dier grev tamamland.. // 15. saniyede
13.4. CompletableFuture#supplyAsync
CompletableFuture#supplyAsync
metodu
CompletableFuture#runAsync
metodu gibidir. Fakat koma sonucunda geriye bir sonu dndrebilmektedir. Bir i sonunda
geriye hesaplanm bir deer dndrmeye ihtiya duyulduu noktada kullanlabilir.
rnein, /var/log dizinindeki tm dosya ve klasrlerin listesini hesaplatmak istiyoruz
diyelim.
CompletableFuture<List<Path>> future = CompletableFuture.supplyAsync(() -> {
Stream<Path> list = Stream.of();
try {
list = Files.list(Paths.get("/var/log"));
} catch (IOException e) {
79
lk yol, join()
metodu kullanmak
e.printStackTrace();
}
return list.collect(Collectors.toList());
});
80
13.7. CompletableFuture#runAfterBoth*
ki asenkron i birden tamamlandnda bir Runnable trnden nesneyi koturmay salar.
CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
81
CompletableFuture#runAfterEither*
}
});
CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> {
return 10;
});
future1.runAfterBoth(future2,()->{
System.out.println("kisi birden bitti"); // 5. saniyede
});
13.8. CompletableFuture#runAfterEither*
ki asenkron iden herhangi biri tamamlandnda bir Runnable trnden nesneyi
koturmay salar.
CompletableFuture<Void> future1 = CompletableFuture.runAsync(() -> {
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
});
CompletableFuture<Integer> future2 = CompletableFuture.supplyAsync(() -> {
return 10;
});
future1.runAfterEither(future2,()->{
System.out.println("kisinden biri tamamland.."); // 0. saniyede
});
13.9. CompletableFuture#handle*
CompletableFuture#handleAsync
metodu
bir
nceki
asenkron
grevin
sonucunu ilemek ve ardndaki grevlere paslamak iin yaplandrlmtr.
CompletableFuture#handleAsync ile, birbirini besleyen zincirler eklinde asenkron i
aklar yazlabilir.
rnein, iki asenkron iten birini, dierini besler eklinde yaplandralm.
Grev 1
Asenkron olarak bir dizindeki tm dosya ve dizinler bulunsun
82
CompletableFuture#handle*
Grev 2
Bulunan dizinlerin boyut bilgisi asenkron olarak hesaplansn
Grev 3
Dosya yolu ve boyut bilgisi asenkron olarak listelensin.
CompletableFuture.supplyAsync(() -> {
Stream<Path> list = Stream.of();
try {
list = Files.list(Paths.get("/var/log"));
} catch (IOException e) {
throw new RuntimeException(e);
}
return list.collect(Collectors.toList());
}).handleAsync((paths, throwable) -> {
Map<Path, Long> pathSizeMap = new HashMap<>();
try {
for (Path path : paths) {
long size = Files.size(path);
pathSizeMap.put(path, size);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
return pathSizeMap;
}).thenAccept(map -> {
for (Map.Entry<Path, Long> entry : map.entrySet()) {
System.out.printf("%s | %d bytes %n",entry.getKey(),entry.getValue());
}
});
83
CompletableFuture#handle*
84
https://terrencebarr.wordpress.com/2014/04/30/java-me-8-released/
85
ktlamaktr. Gml sistemlerin Hello World ' ise, bir LEDi yakmaktr. Biraz daha
detaylandrrsak, cihazn GPIO (Genel amal giri k) pinlerini ynetmektir.
Gml sistemlerde genel olarak bir pin, hem giri hem de k olarak kullanlabilmektedir.
ahsm Raspberry PI Model B Revision 1 sahibiyim ve onda 8 adet GPIO pini
bulunuyor. Bu pinleri hem giri, hem de k olarak kullanabilmekteyiz.
14.2.1. Raspberry PI
Raspberry PI Model B (Revision 1 veya Revision 2). Bende eski olan Revision 1 bulunuyor.
Revision 2de GPIO pin saysnn daha fazla olduunu ve birka ufak deiikliin olduunu
2
gryorum (Bkz. upcoming-board-revision ).
3
Henz Raspberry PIniz yok ise, Farnell veya RS Components gibi firmalardan elde
edebilirsiniz. 75 gmrk snrn amad iin en uygun elde etme biimi bu. Fakat
4
robotistan gibi yerli giriimlerden elde etmekte mmkn.
2
http://www.raspberrypi.org/upcoming-board-revision/
3
http://uk.rs-online.com/web/p/processor-microcontroller-development-kits/8111284/
4
http://www.robotistan.com/
86
SD Kart
14.2.3. SD Kart
Raspberry PIyi satn aldmda SD Kart yannda gelmiti, fakat uan bu uygulama yaplyor
mu bilmiyorum. letim sisteminin kurulmas iin SD kart gerekmektedir.
14.2.4. Adaptr
5V kl microusb adaptr tercih edebilirsiniz.
http://www.ebay.com/itm/Mini-Wireless-USB-WiFi-Dongle-Adapter-for-Raspberry-Pi-802-11-b-gn-150Mbps-/191193467885?pt=AU_Components&hash=item2c8404cbed
87
http://www.ebay.com/itm/GPIO-Electronics-Starter-Kit-for-Raspberry-Pi-LCD-IR-SwitchDS18B20-/151285843554?pt=LH_DefaultDomain_15&hash=item233956c662
88
HDMI Kablosu
http://www.ebay.com/itm/2M-Gold-Plated-Connection-HDMI-CableV1-4-HD-1080P-for-LCD-DVD-HDTV-Samsung-PS3-/151326918511?
pt=UK_Computing_Sound_Vision_Video_Cables_Adapters&hash=item233bc9876f
89
Yazlmsal Gereksinimler
Java ME 8 SDK
8
Java ME 8 SDKyi uanlk sadece Windows ortamnda kullanabiliyoruz. Java ME SDK
'y bu adresten edinerek sistemimize kurabiliriz.
Java ME 8 Plugin (Netbeans veya Eclipse)
9
Java ME SDK Plugins sayfasndan Java ME SDK Plugins for NetBeans
indiriyoruz. ndirdiimiz, zip dosyasn bir istediimiz bir dizine ayklayp, iindeki .npm
uzantl eklentilerin hepsini yklyoruz.
Tools > Plugins > Downloaded
http://www.oracle.com/technetwork/java/embedded/javame/javame-sdk/downloads/
javamesdkdownloads-2166598.html
9
http://www.oracle.com/technetwork/java/embedded/javame/javame-sdk/downloads/
javamesdkdownloads-2166598.html
10
http://www.oracle.com/technetwork/java/embedded/javame/embed-me/downloads/java-embedded-java-medownload-2162242.html
90
Raspbian OS Kurulmas
11
http://www.raspberrypi.org/documentation/installation/installing-images/
91
Devrenin Kurulmas
92
12
indirilir.
12
http://sourceforge.net/projects/getgnuwin32/files/
93
$ cd /Downloads
$ scp oracle-jmee-8-1-rr-raspberrypi-linux-bin.zip pi@192.168.2.61:/home/pi/jmee
94
$ ssh pi@192.168.2.61
$ pi@192.168.2.61's password: raspberry
$ cd /home/pi/jmee
$ unzip oracle-jmee-8-1-rr-raspberrypi-linux-bin.zip
$ cd /bin
$ sudo ./usertest.sh
95
Device Managera
Rapberry PI Tantmak
96
Java ME 8 Embedded
Projesinin Oluturulmas
14.8.1. Adm 1
File > New Project mens takip edilir ve Java Me Ebdedded > Java Me Ebdedded
Application seilir.
Adm 2
14.8.2. Adm 2
Proje ismi ve gerekliyse dier ksmlar dzenlenir.
14.8.3. Adm 3
Bu admda oluan proje gzlemlenir ve JavaMeRaspi adnda Midlet trnden bir snfn
oluturulduu grlr.
98
Uygulamann Yazlmas
99
Uygulamann Yazlmas
led5.setValue(true);
bekle(1000);
led5.setValue(false);
bekle(1000);
}
}
private void bekle(int sure) {
try {
Thread.sleep(sure);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
@Override
public void destroyApp(boolean unconditional) {
// Uygulama sonland
}
}
Numara
GPIO0
17
GPIO1
18
GPIO2
R1:21 / R2:27
100
Port
Numara
GPIO3
22
GPIO4
23
GPIO5
24
GPIO6
25
GPIO7
4
R1 : Revision 1
R2 : Revision 2
13
Daha detayl pin bilgileri iin
13
https://projects.drogon.net/raspberry-pi/wiringpi/pins/
101
Uygulama zinlerini
Tanmlamak
102
Uygulamann altrlmas
14
15
16
14
https://docs.oracle.com/javame/8.1/get-started-rpi/toc.htm
15
http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/RaspberryPi_GPIO/RaspberryPi_GPIO.html
16
https://projects.drogon.net/raspberry-pi/wiringpi/pins
103
104
1
http://asciidocfx.com/
2
http://asciidoctor.org/docs/asciidoc-syntax-quick-reference/
105
106