Aşağıdaki kodda bir akışın veya listenin son öğesini nasıl alabilirim?
Nerede data.careas
bir olduğunu 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?
Gördüğünüz gibi ilk unsuru kesin filter
olarak elde etmek zor değil.
Ancak son öğeyi tek satırda almak gerçek bir acıdır:
- Görünüşe göre onu doğrudan bir
Stream
. (Yalnızca sonlu akışlar için mantıklı olacaktır) - Ayrıca gibi şeyler alamayan görünüyor
first()
velast()
gelenList
gerçekten acıdır arayüzü.
Arayüzde bir first()
ve last()
yöntemi sağlamamak için herhangi bir argüman görmüyorum List
, çünkü oradaki elemanlar sıralı ve dahası boyut biliniyor.
Ancak orijinal cevaba göre: Sonlu bir öğenin son öğesi nasıl elde edilir Stream
?
Şahsen, alabildiğim en yakın şey bu:
int lastIndex = data.careas.stream()
.filter(c -> c.bbox.orientationHorizontal)
.mapToInt(c -> data.careas.indexOf(c)).max().getAsInt();
CArea last = data.careas.get(lastIndex);
Bununla birlikte indexOf
, her öğede bir kullanmayı içerir ve bu, performansı azaltabileceği için genellikle istemezsiniz.
Stream
API, LINQ
her ikisi de çok farklı bir paradigmada yapıldığından tam olarak karşılaştırılabilir değildir . Daha kötü ya da daha iyi değil, sadece farklı. Ve kesinlikle bazı yöntemler eksik değil çünkü oracle geliştiriciler yetersiz veya
Iterables.getLast
yinelenebilen ancak çalışmak için optimize edilmiş olanı sağlarList
. Bir evcil hayvan, sahip olmamasıdırgetFirst
.Stream
Genel API kolaylık yöntemleri çok atlayarak, korkunç anal olduğunu. Constrast gereği C # 'ın LINQ'su, sonsuz Numaralandırmayı da desteklese.Last()
bile.Last(Func<T,Boolean> predicate)
, sağlamaktan mutludur .