Java 8 akışı ile sıralama başlık altında nasıl çalışır?


10

Aradığımda Stream.sort(..), oluşturulan yeni bir dizi öğe var ve akış yeni oluşturulan sıralı dizi üzerinden yineleniyor mu?

Başka bir deyişle, Java 8 Stream sortbaşlık altında nasıl çalışır ?


Neden bu soru ile aşağı oy alıyorum ???
InformedA

2
Sorunuz makul ve downvotes hak etmiyor. Amon'un cevabı hakkındaki yorumlarınız yine de ... ugh: |
Andres F.1

@AndresF. Aşağı oy, ben bu yorumu yapmadan önce bile geldi. Bu yüzden çok üzüldüm.
InformedA

Yorumlar yine de aşağılamak için bir sebep değil. Soru kendi değerine dayanıyor ve bence geçerli. Onu iptal ettim.
Andres F.1

Yanıtlar:


10

Java standart kütüphane kodunda (ve diğer bazı kütüphanelerde) arama yapmak için grepcode.com adresini kullanabilirsiniz . Ne yazık ki, akış uygulama kodu oldukça soyut. İyi bir başlangıç ​​noktası, bir akışı sıralı bir akışa dönüştüren dahili java.util.stream.SortedOpssınıftır .

Şu anki uygulama (standart kütüphane kapların akışları için kullanılan) bu akış daha önce sıralansaydı no-op yapar, akımın boyutu (biliniyorsa bir dizi kullanan SizedRefSortingSink) veya boyuta ise, bir ArrayList'in tüm elemanları birikir bilinmiyor ( RefSortingSink).

Elbette, bu tür uygulama ayrıntıları herhangi bir sürümle değişebilir, ancak temel hususlar evrenseldir: Bir akışı sıralamak mutlaka bir istekli / engelleme işlemidir ve sonsuz bir akışı sıralamak anlamlı değildir. Bu, akışları tembel olabileceğinden kullanırsanız bir akışı sıralamanın kullanışlı olmadığı anlamına gelir, ancak yine de uygun akış sözdizimini alırsınız.

Diğer akışlar, Stream.sorted()muhtemelen benzer olacak olan kendi uygulamalarını sağlamak zorunda kalacaklar.


1
Lambdaların veya akarsuların “başlık altında saçmalık” olacağını öne sürmek istemiyorum. Akışlarla ilgili ayrıntılar, diğer Java kavramlarına kıyasla alışılmadık derecede karmaşık olmasına rağmen, ikisi de inanılmaz derecede uygundur. Bu araçların işe yaramaz veya zararlı olduğu konusunda önceden düşünmüş olduğunuz fikrine bağlı kalmak istiyorsanız, kendinizi gereksiz yere sınırlandırıyorsunuz.
amon

1
@ amon - kabul edilen artı akışlar, uygulamayı neredeyse değiştirmeden çok çekirdekli paralel uygulamaları kaputun altına yuvarlama imkanı sağlar. Akış uygulamasının karmaşıklığı da tam olarak bundan geliyor. Bu kolaylıktan çok daha fazlası, bu doğru soyutlama. OP için - Lambdaların Mastering'i okumanızı öneririm ... lambdasların ve akarsuların neden bu kadar kullanışlı özelliklerden çok daha fazla olduğunu anlamak istiyorsanız.
Yuri Steinschreiber

3
A: Lambdas yaklaşık 80 yıldır var ve hemen hemen her ana akım programlama dilinde var. Akışlar yaklaşık 40 yıldır var ve benzer şekilde hemen hemen her ana akım koleksiyon çerçevesinde var. Bunlara farklı şeyler denebilir (yineleyiciler, tembel listeler, numaralandırıcılar, numaralandırıcılar), ama oradalar. Lambdalar ve tembel listeler, var olan en eski ve en istikrarlı soyutlamalardan bazılarıdır ve onlara atılan her yeni moda, yutturmaca, paradigma, hareket, metodoloji, teknoloji, dil, işletim sistemi, çerçeve, kütüphane hayatta kaldılar. Bu onları bir göz atmaya değer kılar.
Jörg W Mittag

2
Programlama dili olan Java, JVM'de çalışan bayt kodunun saçma bir soyutlamasıdır. JVM kendisi sadece C (veya C ++, unuttum) yazılmış bir saçmalık soyutlamadır. C ve C ++ sadece montaj dili üzerinde saçma soyutlamalardır. Montaj dilinin kendisi bile, mikrokodlar üzerinde bir saçmalık soyutlamadır, bu da devreler üzerinde bir saçmalık soyutlamasıdır (tamam, aralarında birkaç adım eksik olabilir). Yazılımda yararlı olan her şeyin başka bir şey üzerinde "saçma bir soyutlama" olduğunu söyleyebiliriz.
Andres F.1

3
Dürüst tavsiyem, işlevsel programlamaya Java'dan daha odaklı bir dil öğrenmeye çalışmanızdır. Günlük işiniz için hiç kullanmasanız bile, Java ile size yardımcı olacak programlama dillerini ve tasarım seçeneklerini anlayacaksınız :)
Andres F.
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.