पिछले प्रश्न में [How to dynamically do filtering in Java 8?] स्टुअर्ट मार्क्स ने एक अद्भुत जवाब दिया, और धारा से शीर्ष और शीर्ष पर आधारित के चयन को संभालने के लिए कई उपयोगी उपयोगिताओं प्रदान की।Java 8 lambda का उपयोग कर स्ट्रीम से आइटम्स की एक श्रृंखला कैसे प्राप्त करें?
मैं उन्हें अपने मूल जवाब से यहां शामिल करेंगे:
@FunctionalInterface
public interface Criterion {
Stream<Widget> apply(Stream<Widget> s);
}
Criterion topN(Comparator<Widget> cmp, long n) {
return stream -> stream.sorted(cmp).limit(n);
}
Criterion topPercent(Comparator<Widget> cmp, double pct) {
return stream -> {
List<Widget> temp =
stream.sorted(cmp).collect(toList());
return temp.stream()
.limit((long)(temp.size() * pct));
};
}
मेरे यहाँ प्रश्न हैं:
[1] कैसे की निश्चित राशि के साथ एक धारा से 7 के लिए 3 से शीर्ष आइटम प्राप्त करने आइटम है, तो धारा A1, A2 .. A10,
topNFromRange(Comparator<Widget> cmp, long from, long to) = topNFromRange(comparing(Widget::length), 3L, 7L)
करने के लिए कॉल वापस आ जाएगी {A3, A4, A5, A6, ए 7} से
+०१२३५१६४१०६१ आइटम नहीं है अगरसबसे सरल तरीका मैं सोच सकता हूं कि मूल से शीर्ष 7 [टी 7] प्राप्त करें, मूल से शीर्ष 3 [टी 3] प्राप्त करें, और फिर टी 7 - टी 3 प्राप्त करें।
[2] कैसे मदों की निश्चित राशि के साथ एक धारा से 30% ऊपर शीर्ष 10% से ऊपर आइटम प्राप्त करने, इसलिए धारा एक्स 1 से आइटम है, तो X2 .. X100,
topPercentFromRange(Comparator<Widget> cmp, double from, double to) = topNFromRange(comparing(Widget::length), 0.10, 0.30)
करने के लिए कॉल
{X10, X11, X12, ..., X29, X30} वापस आ जाएगी
सबसे आसान तरीका मैं के बारे में सोच सकते हैं पाने के शीर्ष 30% [TP30] मूल से, मिल शीर्ष 10% है [TP10 ] मूल से, और फिर टीपी 30 - टीपी 10 प्राप्त करें।
उपरोक्त स्थितियों को संक्षेप में व्यक्त करने के लिए जावा 8 लैम्ब्डा का उपयोग करने के कुछ बेहतर तरीके क्या हैं?
जो कुछ मैं ढूंढ रहा था उसके लिए पर्याप्त बंद करें, मैं विवरण तैयार करूंगा, धन्यवाद! – Frank
मैंने अपना जवाब अपडेट किया है जिसमें आप जो भी कर रहे हैं उसका एक रूप भी शामिल कर सकते हैं, लेकिन फिर कलेक्टरों का उपयोग करके, शायद यह मानदंडों के मूल प्रश्न के लिए भी दिलचस्प हो सकता है? – skiwi
@skiwi संग्रह को संग्रह में बदलने के लिए एक कलेक्टर के फिनिशर फ़ंक्शन का उपयोग करके दिलचस्प है। मुझे यकीन नहीं है कि यह एक स्थानीय चर घोषित करने की तुलना में बेहतर या बदतर है। (लैम्बडा पैरामीटर इस मामले में एक स्थानीय की तरह प्रयोग किया जाता है।) हालांकि, भविष्य के लिए ध्यान में रखना एक उपयोगी तकनीक है। –