{"id":119,"date":"2016-08-25T13:44:35","date_gmt":"2016-08-25T10:44:35","guid":{"rendered":"http:\/\/selcukuzunsoy.com\/?p=119"},"modified":"2021-02-08T12:53:28","modified_gmt":"2021-02-08T09:53:28","slug":"stream-api-j2se8-mimarisi-ve-kullanim-teknikleri-bolum-1","status":"publish","type":"post","link":"https:\/\/selcukuzunsoy.com\/index.php\/2016\/08\/25\/stream-api-j2se8-mimarisi-ve-kullanim-teknikleri-bolum-1\/","title":{"rendered":"Stream API (J2SE8) mimarisi ve kullan\u0131m teknikleri: B\u00f6l\u00fcm-1"},"content":{"rendered":"<p>Herkese merhaba;<\/p>\n<p>      Bu makale ile Java 8 standart\u0131 olan stream api mimarisi hakk\u0131nda sizlere bilgi vermeye \u00e7al\u0131\u015faca\u011f\u0131m. \u00d6ncelikle stream api ile ilgili bilinmesi gereken birtak\u0131m temel \u00f6zelliklere de\u011finelim:<\/p>\n<p> Ama\u00e7: Y\u0131\u011f\u0131nsal da denilen dizileri listeleri d\u00fczenlemey yarayan bir apidir. Bunlara \u00f6rnek olarak primitive veya obje diziler olan int[] veya String[] gibi modeller veya JCF de bahsi ge\u00e7en Collection interface inden geni\u015fleyen ArrayList, HashSet, LinkedHashMap, List, Set vs t\u00fcm bu \u00f6rnek tiplere m\u00fcdehaleyi kolayla\u015ft\u0131ran bir API dir.<\/p>\n<p>\u00d6rnek kullan\u0131m bi\u00e7imlerine de\u011finecek olur isek temel dizi bile\u015fenlerinden ba\u015flayabiliriz:<\/p>\n<p>\u00d6nce temel bir dizi bile\u015feni olu\u015ftural\u0131m:<br \/>\n<script type=\"syntaxhighlighter\" class=\"brush: java\"><![CDATA[\nList<String> dizi=Arrays.asList(\"Abcde\",\"Bcde\",\"Cdefg\",\"H\u0131ijk\",\"Ijklm\",\"Jklmn\",\"Klmno\",\"Lmnop\");\n<\/script>\n\n\n\n<pre>\r\n<strong>\u00d6n izlem:<\/strong>\r\n<img decoding=\"async\" src=\"http:\/\/selcukuzunsoy.com\/images\/makale1\/streamapi_1.gif\" alt=\"String listenin Lambda ve Stream api kullan\u0131larak yazd\u0131r\u0131lmas\u0131.\" \/>\r\n<\/pre>\n\n\n\n\n\u015eimdi diziyi Stream e \u00e7evirelim:\n<script type=\"syntaxhighlighter\" class=\"brush: java\"><![CDATA[\nStream<String> islemdizisi = dizi.stream();\n<\/script>\n\n\u015eimdi son olarak Stream api si ile gelen forEach d\u00f6ng\u00fcs\u00fc ile verileri g\u00f6r\u00fcnt\u00fcleyelim:\n\n\n<pre class=\"brush:java;\" >\r\nislemdizisi.forEach(basliklar ->{\r\n\t\t\tSystem.out.println(\"Ba\u015fl\u0131k:\"+ basliklar);\r\n\t\t\t\r\n\t\t}); \r\n<\/pre>\n\n\n\n\n<strong>Burada anlamam\u0131z gereken birtak\u0131m nesneler ve komutlar var:<\/strong>\n\n1. Stream(): Bu bir interface dir ve BaseStream i extend etmi\u015ftir. Generik bir yap\u0131ya sahiptir. Stream objelerinin bar\u0131nd\u0131r\u0131lmas\u0131 i\u00e7in nesnemizi bu tip ile tan\u0131ml\u0131yoruz.\n2. ForEach: Bu komut bir stream i\u00e7inde elemanlar aras\u0131 d\u00f6ng\u00fc ile ge\u00e7i\u015fi sa\u011flamaktad\u0131r. \u0130\u00e7inde Lambda tan\u0131mlama bi\u00e7imlerini destekleyen bir d\u00f6ng\u00fc modelidir.\n3. Basliklar ->{ System.out.println(&#8220;Ba\u015fl\u0131k:&#8221;+ Basliklar);} : ForEach ile listeden gelen de\u011fi\u015fken tipini otomatik olarak tan\u0131mlar ve bu kullan\u0131m bi\u00e7imi ile 1 de\u011fi\u015fken al\u0131r kendi scope una ( {}  alan\u0131 : scope). D\u00f6ng\u00fc ile her d\u00f6n\u00fc\u015fte i\u00e7indeki liste eleman\u0131 Baslik de\u011fi\u015fkenine atan\u0131r. \u0130\u00e7eride ise bu de\u011fi\u015fken kullan\u0131l\u0131r.\n\n<strong>Inner Class veya Pojo ile  Kullan\u0131m\u0131: <\/strong>\n\n<strong>\u00d6ncelikle StreamOrnek.class ismi ile bir s\u0131n\u0131f olu\u015fturuyorum, i\u00e7ine de class tan\u0131m\u0131 yap\u0131yorum:<\/strong>\n\n\n<pre class=\"brush:java;\" >\r\nclass StreamOrnek {\r\n\tpublic class ornekPojo{\r\n\t\tprivate Long id;\r\n\t\tprivate String ad;\r\n\t\tprivate String soyad;\r\n\t\tprivate String tc;\r\n\t\tpublic Long getId() {\r\n\t\t\treturn id;\r\n\t\t}\r\n\t\tpublic void setId(Long id) {\r\n\t\t\tthis.id = id;\r\n\t\t}\r\n\t\tpublic String getAd() {\r\n\t\t\treturn ad;\r\n\t\t}\r\n\t\tpublic void setAd(String ad) {\r\n\t\t\tthis.ad = ad;\r\n\t\t}\r\n\t\tpublic String getSoyad() {\r\n\t\t\treturn soyad;\r\n\t\t}\r\n\t\tpublic void setSoyad(String soyad) {\r\n\t\t\tthis.soyad = soyad;\r\n\t\t}\r\n\t\tpublic String getTc() {\r\n\t\t\treturn tc;\r\n\t\t}\r\n\t\tpublic void setTc(String tc) {\r\n\t\t\tthis.tc = tc;\r\n\t\t}\r\n       }\r\n}\r\n<\/pre>\n\n\n\n\u0130\u00e7 s\u0131n\u0131flar (inner class) eri\u015fim i\u00e7in kullan\u0131lan y\u00f6ntemlerden biri \u015f\u00f6yledir:\n\n\n<pre class=\"brush:java;\" >\r\nStreamOrnek.ornekPojo obj1  =  new StreamOrnek().new ornekPojo();\r\n<\/pre>\n\n\n\nBurada \u00f6nce Ana s\u0131n\u0131f yaz\u0131l\u0131r ard\u0131ndan alt s\u0131n\u0131f ad\u0131 belirtilir. (Android de R class\u0131 \u00f6rne\u011fi gibi.)\n\n\u015eimdi bu s\u0131n\u0131flardan \u00f6rnek objeler yaratal\u0131m:\n\n\n\n<pre class=\"brush:java;\" >\r\n\t\tStreamOrnek.ornekPojo obj1  =  new StreamOrnek().new ornekPojo();\r\n\t\tobj1.setId(1L);\r\n\t\tobj1.setAd(\"Sel\u00e7uk\");\r\n\t\tobj1.setSoyad(\"Uzunsoy\");\r\n\t\tobj1.setTc(\"12345678910\");\r\n\t\r\n\t\tStreamOrnek.ornekPojo obj2  =  new StreamOrnek().new ornekPojo();\r\n\t\tobj2.setId(2L);\r\n\t\tobj2.setAd(\"R2D2\");\r\n\t\tobj2.setSoyad(\"Starwars\");\r\n\t\tobj2.setTc(\"1010101010101010\");\r\n<\/pre>\n\n\n \nYaratt\u0131\u011f\u0131m\u0131z bu objeleri \u015fimdi diziye atal\u0131m ve bu diziyi stream e \u00e7evirelim:\n\n<script type=\"syntaxhighlighter\" class=\"brush: java\"><![CDATA[\nList<StreamOrnek.ornekPojo> dizi_pojo =Arrays.asList(obj1, obj2);\n<\/script>\n\nD\u00f6n\u00fc\u015f\u00fcm zaman\u0131 : ) \n\n<script type=\"syntaxhighlighter\" class=\"brush: java\"><![CDATA[\nStream<StreamOrnek.ornekPojo> islemdizisi_pojo = dizi_pojo.stream();\n<\/script>\n\n\nStream i\u00e7indeki s\u0131n\u0131f tan\u0131mlamas\u0131na odaklan\u0131n: Stream<StreamOrnek.ornekPojo> burada Stream i\u00e7inde art\u0131k inner class \u0131n oldu\u011funu generik tip tan\u0131mlama ile belirtiyoruz.\n\nBu tip tan\u0131mland\u0131ktan sonra foreach ile bu nesneleri yazd\u0131rabilirim:\n\n\n\n<pre class=\"brush:java;\" >\r\nislemdizisi_pojo.forEach(obj ->{\r\n\t\t\tSystem.out.println(\"ID:\"+ obj.getId());\r\n\t\t\tSystem.out.println(\"\u0130sim:\"+ obj.getAd());\r\n\t\t\tSystem.out.println(\"Soyisim:\"+ obj.getSoyad());\r\n\t\t\tSystem.out.println(\"TC:\"+ obj.getTc());\r\n});\r\n<\/pre>\n\n\n\nBuradaki obj ifadesi otomatik olarak StreamOrnek.ornekPojo ya cast edilecek. (Lambda ifadeleri ) Bu sayede tip g\u00fcvenli\u011fi sa\u011flanm\u0131 \u015foluyor.\n\nPeki bunu ba\u015fka \u015fekilde nas\u0131l yazd\u0131rabiliriz ?  \nE\u011fer bir method :: \u201ciki nokta \u00fcst \u00fcste operat\u00f6r\u00fc\u201d ile bir s\u0131n\u0131ftan \u00e7a\u011f\u0131r\u0131l\u0131r ise method ismini verdi\u011fimizde, parametresi  giden obje t\u00fcr\u00fcnden olan method \u00e7a\u011f\u0131r\u0131lacakt\u0131r.\n\nMesela:    islemdizisi_pojo.forEach(StreamOrnek::yazdir);\n\nStreamOrnek i\u00e7inde yazd\u0131r ad\u0131nda bir parametreli bir method tan\u0131ml\u0131yoruz:\n\n\n<pre class=\"brush:java;\" >\r\n\tpublic static void yazdir(StreamOrnek.ornekPojo veri){\t\t\r\n\t\tSystem.out.println(\"Bilgi Pojo kullan\u0131m\u0131:\"+veri.getAd());\r\n\t}\r\n<\/pre>\n\n\n\nPeki \u015fimdi objeyi listeye koyduk ama i\u00e7inden bir se\u00e7im yapmak istiyorsam ne yapmal\u0131y\u0131m ? Mesela objenin bir parametresi kay\u0131t edilen ismi veriyor. Bu bana istedi\u011fim ismi arama \u015fans\u0131 veriyor mu acaba ? \n\n<script type=\"syntaxhighlighter\" class=\"brush: java\"><![CDATA[\nPredicate<StreamOrnek.ornekPojo> pd_pojo = icindeki_deger -> icindeki_deger.getAd().contains(\"R2D2\");\n<\/script>\n\nBurada liste i\u00e7inde kay\u0131tl\u0131 objelerden ad\u0131nda R2D2 olan objeler gelmesi i\u00e7in Predicate functional Interface inden faydalan\u0131yoruz. Bu tip bir ko\u015ful Lambda beti\u011fi yazarak filter komutu arac\u0131\u011f\u0131 ile liste i\u00e7indeki verileri s\u00fcz\u00fcyoruz.\n\n<script type=\"syntaxhighlighter\" class=\"brush: java\"><![CDATA[\nStream<StreamOrnek.ornekPojo> filtrelenmis_islemdizisi_pojo = islemdizisi_pojo.filter(pd_pojo); \n<\/script>\n\n\u015eimdi s\u0131ra yazd\u0131rmada: \n\n\n\n<pre  class=\"brush:java;\" >\r\nfiltrelenmis_islemdizisi_pojo.forEach(StreamOrnek::yazdir);\r\n<\/pre>\n\n\n\nyazd\u0131r methodunun parametresi , kulland\u0131\u011f\u0131m\u0131z objenin tipindeydi !\n<script type=\"syntaxhighlighter\" class=\"brush: java\"><![CDATA[\nList<Integer> dizi_values =Arrays.asList(1,2,3,4,5,6,7,8,9,10);\n<\/script>\nStream tek kullan\u0131ml\u0131k bir yap\u0131ya sahiptir. Bir kere kullan\u0131ld\u0131\u011f\u0131nda yeniden stream yaratman\u0131z gerekir:\n\n\n<pre  class=\"brush:java;\" >\r\nislemdizisi_values = dizi_values.stream();\r\n<\/pre>\n\n\nDizi i\u00e7indeki istedi\u011fim de\u011fer aral\u0131\u011f\u0131n\u0131 Predicate ile belirliyorum:\n<script type=\"syntaxhighlighter\" class=\"brush: java\"><![CDATA[\nPredicate<Integer> pd = icindeki_deger -> icindeki_deger < 6;\n<\/script>\n\n\n\n<pre>\r\n<strong>\u00d6n izlem:<\/strong>\r\n<img decoding=\"async\" src=\"http:\/\/selcukuzunsoy.com\/images\/makale1\/streamapi_2.gif\" alt=\"Say\u0131sal i\u00e7erikli bir listenin Stream filtre kullan\u0131larak veri setinin k\u0131s\u0131tland\u0131r\u0131lmas\u0131.\" \/>\r\n<\/pre>\n\n\n\nBurada 6 dan k\u00fc\u00e7\u00fck de\u011ferler filtrelenmesi i\u00e7in \u00f6n haz\u0131rl\u0131k yap\u0131yorum.\n<script type=\"syntaxhighlighter\" class=\"brush: java\"><![CDATA[\nStream<Integer> filtrelenmis_islemdizisi_values = islemdizisi_values.filter(pd);\n<\/script>\nfilter komutunu kullanarak gerekli \u015fekilde eleme i\u015flemini yapt\u0131r\u0131yoruz.\n\n\u015eimdi method referans\u0131 ile otomatik olarak yazd\u0131rmak i\u00e7in Integer parametresi alan bir yazd\u0131r methodu yaz\u0131yorum:\n\n\n<pre  class=\"brush:java;\" >\r\n\tpublic static void yazdir(Integer veri){\t\t\r\n\t\tSystem.out.println(\"Bilgi\"+veri);\r\n\t}\r\n<\/pre>\n\n\nBu methodu forEach i\u00e7inde kullarak otomatik olarak \u00e7a\u011f\u0131r\u0131lmas\u0131n\u0131 sa\u011fl\u0131yorum:\n\n\n<pre  class=\"brush:java;\" >\r\nfiltrelenmis_islemdizisi_values.forEach(StreamOrnek::yazdir);\r\n<\/pre>\n\n\nE\u011fer verilerin tekrarl\u0131 olanlar\u0131n\u0131 listeden elemek istiyor isem, distinct komutunu kullanmal\u0131y\u0131m:\n<script type=\"syntaxhighlighter\" class=\"brush: java\"><![CDATA[\nList<Integer> tekrarliDizi = Arrays.asList(1,2,3,4,4,4,5,5,6,6,6,6,7,7,8,8,9,10);\ntekrarliDizi.stream().distinct().forEach(deger ->{ System.out.println(\"Veriler:\"+deger);});\n<\/script>\nE\u011fer otomatik olarak k\u00fc\u00e7\u00fckten b\u00fcy\u00fc\u011fe do\u011fru ASC s\u0131ralama bazl\u0131 bir \u00e7\u0131kt\u0131 almak istiyor isem:\n<script type=\"syntaxhighlighter\" class=\"brush: java\"><![CDATA[\nList<Integer> sirasizDizi = Arrays.asList(10,5,21,12,14,11,11,34,54,65,1,5);\nsirasizDizi.stream().sorted().forEach(deger ->{ System.out.println(\"Veriler:\"+deger);});\n<\/script>\nNOT: E\u011fer s\u0131ralamay\u0131 obje \u00f6zelliklerine g\u00f6re yapmak istiyor iseniz Comparator Interface inden yararlanmal\u0131s\u0131n\u0131z.\n\n\nE\u011fer gelen veriler i\u00e7inden k\u0131s\u0131tl\u0131 say\u0131da g\u00f6sterim yapmay\u0131 istiyor iseniz limit komutu tam size g\u00f6re: \n<script type=\"syntaxhighlighter\" class=\"brush: java\"><![CDATA[\nList<Integer> veriKisitlamasi = Arrays.asList(1,2,3,4,5,6,7,8,9,10);\nveriKisitlamasi.stream().limit(5).forEach(deger ->{ System.out.println(\"Veriler:\"+deger);});\n<\/script>\t\t\n\nE\u011fer listesinin a\u00e7\u0131k aral\u0131kl\u0131 adedini \u201c[  )  k\u00fcme g\u00f6sterimi\u201d istiyor iseniz count kullan\u0131l\u0131r:\n<script type=\"syntaxhighlighter\" class=\"brush: java\"><![CDATA[\nList<Integer> intaralikListesi = Arrays.asList(1,2,3,4,5,6,7,8,9,10);\nSystem.out.println(\"Ka\u00e7 Adet Var:\"+ intaralikListesi.stream().count());\n<\/script>\n\nStream api yap\u0131s\u0131n\u0131n olduk\u00e7a fazla \u00f6zelli\u011fi mevcut ama ben genelde en \u00e7ok kullan\u0131lan \u00f6zelliklerine ilk Stream api makalemde de\u011finmi\u015f oldum. Umar\u0131m yararl\u0131 bulmu\u015fsunuzdur.\n\niyi \u00e7al\u0131\u015fmalar, bol tekrarl\u0131 g\u00fcnler \ud83d\ude42\n\n\n\n<pre>\r\n  <strong>\u00d6rnek kodlar\u0131 indir:<\/strong>\r\n  <a href=\"http:\/\/selcukuzunsoy.com\/makaleler\/makale_1_stream_api\/StreamApi_bolum_1.zip\" >Proje Dosyas\u0131<\/a>\r\n<\/pre>\n\n\n\n\n<pre>\r\nGIT Repository:\r\nAdres: <a href=\"https:\/\/github.com\/uzunsoy\/stream_api_bolum_1.git\" target=\"_blank\" rel=\"noopener\">https:\/\/github.com\/uzunsoy\/stream_api_bolum_1.git<\/a>\r\n<\/pre>\n\n\n<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Herkese merhaba; Bu makale ile Java 8 standart\u0131 olan stream api mimarisi hakk\u0131nda sizlere bilgi vermeye \u00e7al\u0131\u015faca\u011f\u0131m. \u00d6ncelikle stream api ile ilgili bilinmesi gereken birtak\u0131m temel \u00f6zelliklere de\u011finelim: Ama\u00e7: Y\u0131\u011f\u0131nsal da denilen dizileri listeleri d\u00fczenlemey yarayan bir apidir. Bunlara \u00f6rnek olarak primitive veya obje diziler olan int[] veya String[] gibi modeller veya JCF de bahsi &hellip; <a href=\"https:\/\/selcukuzunsoy.com\/index.php\/2016\/08\/25\/stream-api-j2se8-mimarisi-ve-kullanim-teknikleri-bolum-1\/\" class=\"more-link\"><span class=\"screen-reader-text\">Stream API (J2SE8) mimarisi ve kullan\u0131m teknikleri: B\u00f6l\u00fcm-1<\/span> yaz\u0131s\u0131na devam et <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,20],"tags":[],"_links":{"self":[{"href":"https:\/\/selcukuzunsoy.com\/index.php\/wp-json\/wp\/v2\/posts\/119"}],"collection":[{"href":"https:\/\/selcukuzunsoy.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/selcukuzunsoy.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/selcukuzunsoy.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/selcukuzunsoy.com\/index.php\/wp-json\/wp\/v2\/comments?post=119"}],"version-history":[{"count":18,"href":"https:\/\/selcukuzunsoy.com\/index.php\/wp-json\/wp\/v2\/posts\/119\/revisions"}],"predecessor-version":[{"id":79126,"href":"https:\/\/selcukuzunsoy.com\/index.php\/wp-json\/wp\/v2\/posts\/119\/revisions\/79126"}],"wp:attachment":[{"href":"https:\/\/selcukuzunsoy.com\/index.php\/wp-json\/wp\/v2\/media?parent=119"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/selcukuzunsoy.com\/index.php\/wp-json\/wp\/v2\/categories?post=119"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/selcukuzunsoy.com\/index.php\/wp-json\/wp\/v2\/tags?post=119"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}