में तत्व मैं निम्नलिखित वर्ग है खोजने के लिए:जावा 8 स्ट्रीम सूची
public class Item {
int id;
String name;
// few other fields, contructor, getters and setters
}
मैं आइटम की एक सूची है। मैं सूची के माध्यम से पुन: प्रयास करना चाहता हूं और उस उदाहरण को ढूंढना चाहता हूं जिसमें एक विशेष आईडी है। मैं धाराओं के माध्यम से ऐसा करने की कोशिश कर रहा हूँ।
public void foobar() {
List<Item> items = getItemList();
List<Integer> ids = getIdsToLookup();
int id, i = ids.size() - 1;
while (i >= 0) {
id = ids.get(i);
Optional<Item> item = items
.stream()
.filter(a -> a.getId() == id)
.findFirst();
// do stuff
i--;
}
}
क्या यह सूची में पुन: प्रयास करने और मुझे आवश्यक तत्व प्राप्त करने का सबसे अच्छा तरीका है? साथ ही, मुझे आईडी के लिए फ़िल्टर लाइन पर एक त्रुटि मिलती है जो कहता है कि लैम्ब्डा अभिव्यक्तियों में उपयोग किए जाने वाले चर अंतिम या प्रभावी रूप से अंतिम होना चाहिए। हो सकता है कि मैं थोड़ी देर के अंदर आईडी को परिभाषित कर सकूं, जो अपवाद से छुटकारा पा लेना चाहिए। धन्यवाद।
ids.forEach(id ->
list.stream()
.filter(p -> p.getId() == id)
.findFirst()
.ifPresent(p -> {//do stuff here});
);
यहाँ वैकल्पिक दिखाता है कि आपके फिल्टर विधि एक खाली धारा लौट सकते हैं, इसलिए यदि आप findFirst फोन यह एक या शून्य तत्वों पा सकते हैं:
आप सूची में इंडेक्स के लिए और लैम्बडा में वर्तमान आइटम के लिए एक ही वैरिएबल का उपयोग कर रहे हैं। एक अलग नाम चुनें। वह कोड ठीक है, लेकिन काफी अक्षम है। यदि आपके पास एकाधिक आईडी हैं और सभी के लिए संबंधित आइटम ढूंढने की आवश्यकता है, तो हैश मैप <इंटीजर, आइटम> बनाकर शुरू करें और फिर हैश मैप का उपयोग करें। –
मैं अपने कोड में एक अलग चर का उपयोग कर रहा हूं, मैं यहां कोड को सरल बनाने की कोशिश कर रहा था। मैं इसे बदल दूंगा। –
परिवर्तनीय 'id' ** अंदर ** लूप को घोषित करें, और यह प्रभावी रूप से अंतिम होगा। बाहर होने के कारण, आप इसे प्रत्येक पुनरावृत्ति पर पुन: प्रारंभ करते हैं, और यह अंतिम नहीं है। सबसे छोटे दायरे में चर घोषित करना सामान्य रूप से एक सर्वोत्तम अभ्यास है। –