Bagaimana saya bisa mendapatkan elemen terakhir dari aliran atau daftar dalam kode berikut?
Dimana data.careasa List<CArea>:
CArea first = data.careas.stream()
.filter(c -> c.bbox.orientationHorizontal).findFirst().get();
CArea last = data.careas.stream()
.filter(c -> c.bbox.orientationHorizontal)
.collect(Collectors.toList()).; //how to?
Seperti yang Anda lihat, mendapatkan elemen pertama, dengan pasti filter, tidaklah sulit.
Namun mendapatkan elemen terakhir dalam satu baris adalah rasa sakit yang nyata:
- Sepertinya saya tidak bisa mendapatkannya langsung dari a
Stream. (Ini hanya masuk akal untuk aliran yang terbatas) - Tampaknya Anda juga tidak bisa mendapatkan hal-hal seperti
first()danlast()dariListantarmuka, yang sangat merepotkan.
Saya tidak melihat argumen untuk tidak menyediakan metode first()dan last()di Listantarmuka, karena elemen di sana, diurutkan, dan terlebih lagi ukurannya diketahui.
Tetapi sesuai jawaban aslinya: Bagaimana cara mendapatkan elemen terakhir dari sebuah finite Stream?
Secara pribadi, ini yang paling dekat yang bisa saya dapatkan:
int lastIndex = data.careas.stream()
.filter(c -> c.bbox.orientationHorizontal)
.mapToInt(c -> data.careas.indexOf(c)).max().getAsInt();
CArea last = data.careas.get(lastIndex);
Namun itu melibatkan, menggunakan indexOfdi setiap elemen, yang biasanya tidak Anda inginkan karena dapat mengganggu kinerja.
StreamAPI tidak sepenuhnya dapat dibandingkan LINQkarena keduanya dilakukan dalam paradigma yang sangat berbeda. Itu tidak lebih buruk atau lebih baik itu hanya berbeda. Dan pasti beberapa metode tidak ada bukan karena oracle devs tidak kompeten atau jahat :)
Iterables.getLastyang membutuhkan Iterable tetapi dioptimalkan untuk digunakanList. Hewan peliharaan yang mengesalkan adalah dia tidak punyagetFirst. TheStreamAPI pada umumnya adalah mengerikan anal, menghilangkan banyak metode kenyamanan. C #'s LINQ, dengan konstrast, dengan senang hati menyediakan.Last()dan bahkan.Last(Func<T,Boolean> predicate), meskipun mendukung Enumerables yang tak terbatas juga.