Java 8-Stream'de koleksiyonları işlemek için zarif duruş

Yazar | Hollis

Sorumlu Editör | Hu Weiwei

Bu makale Hollis'ten izin alınarak yeniden basılmıştır (ID: hollischuang)

Java'da koleksiyonlar ve diziler, sıklıkla kullandığımız veri yapılarıdır ve bunlara sık sık eklememiz, silmemiz, değiştirmemiz, kontrol etmemiz, toplamamız, saymamız, filtrelememiz ve diğer işlemleri yapmamız gerekir.

Bunun aksine, bu işlemler ilişkisel veri tabanlarında da mevcuttur, ancak Java 8'den önce koleksiyonların ve dizilerin işlenmesi çok uygun değildir.

Ancak, bu sorun Java 8'de geliştirilmiştir. Java 8 API, verileri bildirime dayalı bir şekilde işlemenizi sağlayan Stream adlı yeni bir soyutlama ekler.

Bu makale Stream'in nasıl kullanılacağını tanıtacaktır. Özellikle Stream'in performansı ve ilkesi bu makalenin odak noktası değil, ilgileniyorsanız, bir makale ayrıca tanıtılacaktır.

Akış tanıtımı

Akış, Java küme işlemlerinin ve ifadelerinin yüksek düzeyde bir soyutlamasını sağlamak için SQL deyimleri kullanarak bir veritabanından verileri sorgulamaya benzer sezgisel bir yol kullanır.

Stream API, Java programcılarının üretkenliğini büyük ölçüde artırarak programcıların verimli, temiz ve özlü kod yazmasına olanak tanır.

Bu tarz, bir tür akış olarak işlenecek öğelerin toplanmasını ele alır.Akış, boru hattında iletilir ve filtreleme, sıralama ve toplama gibi boru hattının düğümlerinde işlenebilir.

Akış aşağıdaki özelliklere ve avantajlara sahiptir:

  • Depolama yok. Akış bir veri yapısı değildir, yalnızca belirli bir veri kaynağının görünümüdür, veri kaynağı bir dizi, Java kapsayıcısı veya G / Ç kanalı vb. Olabilir.
  • Fonksiyonel programlama için doğdu. Akışta yapılacak herhangi bir değişiklik, arkasındaki veri kaynağını değiştirmeyecektir. Örneğin, Akış üzerinde bir filtreleme işlemi gerçekleştirmek filtrelenen öğeleri silmez, ancak filtrelenmiş öğeleri içermeyen yeni bir Akış oluşturur.
  • Tembel infaz. Akış üzerindeki işlemler, yalnızca kullanıcının gerçekten sonuca ihtiyacı olduğunda hemen yürütülmez.
  • Sarf malzemesi. Akış yalnızca bir kez "tüketilebilir" ve bir konteynerin yineleyicisi gibi, bir kez geçtikten sonra geçersiz olacaktır, yeniden geçmek isterse yeniden oluşturulması gerekir.

Akışın tam olarak neler yapabileceğini görmek için bir örnek alalım:

Yukarıdaki örnekte, veri kaynağı olarak bazı renkli plastik toplar elde edilir ve kırmızı olanlar filtrelenir ve rastgele üçgenler halinde eritilir. Tekrar süzün ve küçük üçgenleri silin. Son olarak, kalan grafiklerin çevresini hesaplayın.

Yukarıdaki şekilde gösterildiği gibi, akış işleme için üç temel işlem vardır: akış oluşturma, ara işlem ve terminal işlemi.

Akış oluşturma

Java 8'de akış oluşturmanın birden fazla yolu vardır.

1. Mevcut bir koleksiyondan bir akış oluşturun

Java 8'de, Stream ile ilgili birçok sınıf eklemenin yanı sıra, koleksiyon sınıfının kendisi de geliştirildi.Akım yöntemi, bir koleksiyon sınıfını bir akışa dönüştürmek için eklenmiştir.

Liste < Dize > strings = Arrays.asList ("Hollis", "HollisChuang", "hollis", "Merhaba", "Merhaba Dünya", "Hollis"); Akış < Dize > stream = strings.stream (); Yukarıda, mevcut bir Listeden bir akış oluşturun. Ek olarak, koleksiyon için paralel akış oluşturabilen bir parallelStream yöntemi vardır.

Bir koleksiyon aracılığıyla bir Akış oluşturmanın bu yolu da yaygın bir yoldur.

2. Akış aracılığıyla bir akış oluşturun

Belirtilen öğelerden oluşan bir akışı doğrudan döndürmek için Stream sınıfı tarafından sağlanan yöntemleri kullanabilirsiniz.

Akış < Dize > stream = Stream.of ("Hollis", "HollisChuang", "hollis", "Merhaba", "Merhaba Dünya", "Hollis"); Yukarıdaki kodda olduğu gibi, doğrudan yöntemi aracılığıyla bir Akış oluşturun ve döndürün.

Ara işlemleri gerçekleştirin

Akışın birçok ara işlemi vardır. Bir montaj hattı oluşturmak için çoklu ara işlemler bağlanabilir. Her ara işlem montaj hattındaki bir işçi gibidir. Her işçi akışı işleyebilir ve işlemden sonra elde edilen sonuç hala bir akıştır.

Aşağıda, yaygın olarak kullanılan ara işlemlerin bir listesi verilmiştir:

filtre:

Filtre yöntemi, ayarlanan koşullara göre öğeleri filtrelemek için kullanılır. Aşağıdaki kod parçacığı, boş dizeleri filtrelemek için filtre yöntemini kullanır:

Liste < Dize > dizeler = Arrays.asList ("Hollis", "", "HollisChuang", "H", "hollis"); strings.stream (). filter (string- > ! string.isEmpty ()). forEach (System.out :: println); // Hollis`` HollisChuang, H, hollis harita

Eşleme yöntemi, her bir öğeyi karşılık gelen sonuçla eşlemek için kullanılır. Aşağıdaki kod parçası, öğeye karşılık gelen kare sayısının çıktısını almak için eşlemeyi kullanır:

Liste < Tamsayı > sayılar = Arrays.asList (3, 2, 2, 3, 7, 3, 5); sayılar.akım (). harita (i- > i * i) .forEach (System.out :: println); // 9,4,4,9,49,9,25 sınırla / atla

limit, Akışın ilk n öğesini döndürür; atlama, ilk n öğeyi atmaktır. Aşağıdaki kod parçacığı, 4 öğeyi çarpanlarına ayırmak için limit yöntemini kullanır:

Liste < Tamsayı > sayılar = Arrays.asList (3, 2, 2, 3, 7, 3, 5); sayılar.akım (). limit (4) .forEach (System.out :: println); // 3,2,2,3 sıralanmış

Sıralanan yöntem, akışı sıralamak için kullanılır. Aşağıdaki kod parçacığı, sıralamak için sıralı yöntemi kullanır:

Liste < Tamsayı > sayılar = Arrays.asList (3, 2, 2, 3, 7, 3, 5); sayılar.akım (). sıralı (). forEach (System.out :: println); // 2,2,3,3,3,5,7 farklı

Distinct, esas olarak tekilleştirme için kullanılır. Aşağıdaki kod parçası, öğeleri tekilleştirmek için farklı kullanır:

Liste < Tamsayı > sayılar = Arrays.asList (3, 2, 2, 3, 7, 3, 5); sayılar.akım (). farklı (). forEach (System.out :: println); // 3,2,7,5 Daha sonra, bir Akış filtre, harita, sıralama, sınırlama ve ayırt etme yoluyla işlendiğinde ne olduğunu göstermek için bir örnek ve bir resim kullanıyoruz.

kod aşağıdaki gibi gösterilir:

Liste < Dize > strings = Arrays.asList ("Hollis", "HollisChuang", "hollis", "Merhaba", "Merhaba Dünya", "Hollis"); Akış s = strings.stream (). Filter (string- > IP uzunluğu() < = 6) .map (String :: length) .sorted (). Limit (3) .distinct (); Her adımda elde edilen süreç ve sonuçlar aşağıdaki gibidir:

Akış son işlemi

Akışın ara işleminin sonucu hala bir Akımdır, peki bir Akışı ihtiyacımız olan türe nasıl dönüştürebiliriz? Örneğin, akıştaki öğe sayısını hesaplamak, akışı bir küme ile değiştirmek vb. Bu, terminal işlemi gerektirir

Son işlem akışı tüketir ve nihai bir sonuç verir. Başka bir deyişle, son işlemden sonra akış tekrar kullanılamaz veya herhangi bir ara işlem kullanılamaz, aksi takdirde bir istisna atılır:

java.lang.IllegalStateException: akış zaten çalıştırıldı veya kapatıldı

Dediği gibi, "Aynı nehre asla iki kez adım atmayacaksınız" da bu demektir.

Yaygın olarak kullanılan son işlemler aşağıdaki gibidir:

her biri için

Akış, akıştaki her veriyi yinelemek için 'forEach' yöntemini sağlar. Aşağıdaki kod parçacığı, 10 rastgele sayı çıkarmak için forEach kullanır:

Rastgele rastgele = yeni Rastgele (); random.ints (). limit (10) .forEach (System.out :: println); Miktar

count, akıştaki öğelerin sayısını saymak için kullanılır.

Liste < Dize > strings = Arrays.asList ("Hollis", "HollisChuang", "hollis", "Hollis666", "Merhaba", "MerhabaDünya", "Hollis"); System.out.println (strings.stream (). Count ()); // 7 toplamak

Collect, akıştaki öğeleri özet bir sonuç olarak toplamak için çeşitli uygulamaları parametre olarak kabul edebilen bir indirgeme işlemidir:

Liste < Dize > strings = Arrays.asList ("Hollis", "HollisChuang", "hollis", "Hollis666", "Merhaba", "MerhabaDünya", "Hollis"); strings = strings.stream (). filter (string- > string.startsWith ("Hollis")). Collect (Collectors.toList ()); System.out.println (dizeler); // Hollis, HollisChuang, Hollis666, Hollis Daha sonra, göstermek için hala bir resim kullanıyoruz Önceki örnekte, bir Akış filtreleme, haritalama, sıralama, sınırlama ve ayırt etme yoluyla işlendiğinde, farklı son işlemler kullanılarak hangi sonuçların elde edilebileceğini.

Aşağıdaki şekil, makalede tanıtılan tüm işlemlerin yerini, girdisini ve çıktısını ve sonuçları gösteren bir durumu göstermektedir.

sonuç olarak

Bu makale Java 8'de Stream'in kullanımını ve avantajlarını tanıtır. Stream'in çeşitli kullanımları da kabul edilmektedir, yani Akış oluşturma, ara işlemler ve son işlemler.

Akış oluşturmanın iki yolu vardır, yani koleksiyon sınıfının akış yöntemi ve Akış yöntemi aracılığıyla.

Akışın ara işlemleri Akışı işlemek için kullanılabilir. Ara işlemlerin girdisi ve çıktısı Akış'tır. Ara işlemler filtreleme, dönüştürme, sıralama vb. Olabilir.

Akışın son işlemi, Akışı diğer formlara dönüştürebilir; örneğin akıştaki öğelerin sayısını hesaplama, akışı bir setle değiştirme ve öğeleri çaprazlama.

Yazar hakkında: Hollis, tanınmış teknoloji blog yazarı, milyonları okuyan kişisel blog yazısı, CSDN blog uzmanı. Hangzhou'da çalışıyor, esas olarak finans ve ödeme alanlarında Java geliştirme ile uğraşıyor ve teknoloji paylaşımına meraklı.

Bu makale, temel bilgiler, temel ilkeler ve teknoloji gelişimi gibi konuları kapsayan, esas olarak Java ile ilgili teknolojilere dayanan orijinal teknik makalelere odaklanarak Hollis kamu hesabından yeniden üretilmiştir.

Wang Yi bu kelimeleri yüksek sesle söyledi
önceki
"Yıldız kulaklık", yerleşik üreticilerden daha iyi nerede? Gerçek sebep burada!
Sonraki
Seyirci 4 milyonu aştı ve Pekin rol modelleri de bu sergiyi ziyarete geldi.
Boeing 737 sürekli çöktü, AI yapmak zorunda mı?
Bu sadece doymuş yiyecek ve içecek hissi değil
Kaydırılacak! WeChat yakında bu harika özellikleri kullanıma sunacak!
Terry Gou "Patlamalar" Microsoft; Tencent Uygulaması birden fazla flaşı yasaklıyor | Geek Başlıkları
Düşük madeni paralar iyi paraları çıkarır. Görkemli görev hakimiyeti Tencent Games'in rütbesini düşürdü!
İstasyon vagonuna biraz vahşilik katın, Alltrack golfünün ilk atışını yapın
Eski sürücüler için mutlaka görülmesi gereken bir yer! Nasıl "gizli kamera" yapacağınızı öğretin ...
Huawei 5G Avrupa'da yükseliyor!
Hem performans hem de enerji tasarrufu sağlayan bir MPV mi? Song MAX DM'nin üç yönden hızlı bir yorumu
En iyi 10 envanter: Java geliştiricilerinin 2019'da öğrenmesi gereken test çerçeveleri, araçlar ve kitaplıklar!
Önce deneyim, GIGABYTE Western'in ilk ev aletleri yarışması amiral gemisi mağazası Chongqing'de!
To Top