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:
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 haritaEş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 / atlalimit, 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); Miktarcount, 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 toplamakCollect, 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.