मैं निम्नलिखित कोड में एक स्ट्रीम या सूची का अंतिम तत्व कैसे प्राप्त कर सकता हूं?
कहां data.careas
है 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?
जैसा कि आप देख सकते हैं पहला तत्व, एक निश्चित के साथ filter
, कठिन नहीं है।
हालांकि एक लाइनर में अंतिम तत्व प्राप्त करना एक वास्तविक दर्द है:
- ऐसा लगता है कि मैं इसे सीधे से प्राप्त नहीं कर सकता
Stream
। (यह केवल परिमित धाराओं के लिए समझ में आएगा) - ऐसा भी लगता है कि आप इंटरफेस से
first()
और जैसी चीजें प्राप्त नहीं कर सकते , जो वास्तव में एक दर्द है।last()
List
मुझे इंटरफ़ेस में first()
और last()
विधि प्रदान नहीं करने के लिए कोई तर्क नहीं दिखता List
है, क्योंकि वहां के तत्वों का आदेश दिया गया है, और इसके अलावा आकार ज्ञात है।
लेकिन मूल उत्तर के अनुसार: परिमित के अंतिम तत्व को कैसे प्राप्त करें Stream
?
व्यक्तिगत रूप से, यह सबसे निकटतम है जो मुझे मिल सकता है:
int lastIndex = data.careas.stream()
.filter(c -> c.bbox.orientationHorizontal)
.mapToInt(c -> data.careas.indexOf(c)).max().getAsInt();
CArea last = data.careas.get(lastIndex);
हालांकि, इसमें indexOf
हर तत्व का उपयोग करना शामिल है, जो कि आम तौर पर आप नहीं चाहते हैं क्योंकि यह प्रदर्शन को ख़राब कर सकता है।
Stream
एपीआई पूरी तरह से तुलनीय नहीं है LINQ
क्योंकि दोनों एक बहुत ही अलग प्रतिमान में किए गए हैं। यह बदतर या बेहतर नहीं है यह सिर्फ अलग है। और निश्चित रूप से कुछ विधियां अनुपस्थित हैं क्योंकि
Iterables.getLast
जो Iterable लेता है लेकिन साथ काम करने के लिए अनुकूलित हैList
। एक पालतू पशु है कि यह नहीं हैgetFirst
।Stream
सामान्य रूप में एपीआई सुविधा तरीकों की बहुत सारी छोड़ते हुए बुरी तरह गुदा है। कॉन्स्ट्रास्ट द्वारा C # का LINQ, प्रदान करने के लिए खुश है.Last()
और यहां तक कि.Last(Func<T,Boolean> predicate)
, यह अनंत Enumerables का भी समर्थन करता है।