Aşağıdaki kodda bir akışın veya listenin son öğesini nasıl alabilirim?
Nerede data.careasbir 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 filterolarak 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()gelenListgerç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.
StreamAPI, LINQher 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.getLastyinelenebilen ancak çalışmak için optimize edilmiş olanı sağlarList. Bir evcil hayvan, sahip olmamasıdırgetFirst.StreamGenel 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 .