मैं निम्नलिखित कोड में एक स्ट्रीम या सूची का अंतिम तत्व कैसे प्राप्त कर सकता हूं?
कहां 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 का भी समर्थन करता है।