मैं Stream
तत्वों को खोजने के लिए जावा 8 एस का उपयोग करने की कोशिश कर रहा हूं LinkedList
। हालांकि, मैं गारंटी देना चाहता हूं कि फिल्टर मानदंडों में एक और एक ही मैच है।
यह कोड लें:
public static void main(String[] args) {
LinkedList<User> users = new LinkedList<>();
users.add(new User(1, "User1"));
users.add(new User(2, "User2"));
users.add(new User(3, "User3"));
User match = users.stream().filter((user) -> user.getId() == 1).findAny().get();
System.out.println(match.toString());
}
static class User {
@Override
public String toString() {
return id + " - " + username;
}
int id;
String username;
public User() {
}
public User(int id, String username) {
this.id = id;
this.username = username;
}
public void setUsername(String username) {
this.username = username;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public int getId() {
return id;
}
}
यह कोड User
उनकी आईडी के आधार पर मिलता है । लेकिन User
फ़िल्टर कितने से मेल खाते हैं इसकी कोई गारंटी नहीं है ।
फ़िल्टर लाइन को इसमें बदलना:
User match = users.stream().filter((user) -> user.getId() < 0).findAny().get();
फेंक देंगे एक NoSuchElementException
(अच्छा!)
मैं यह चाहूंगा कि यदि एक से अधिक मैच हों, तो त्रुटि को फेंक दें। क्या इसे करने का कोई तरीका है?
Stream::size
?
Stream
मैंने पहले जितना किया था ...
LinkedHashSet
(यह मानते हुए कि आप प्रविष्टि क्रम को संरक्षित रखना चाहते हैं) या एक HashSet
साथ। यदि आपका संग्रह केवल एकल उपयोगकर्ता आईडी खोजने के लिए उपयोग किया जाता है, तो आप अन्य सभी आइटम क्यों एकत्र कर रहे हैं? यदि कोई संभावना है कि आपको हमेशा कुछ उपयोगकर्ता आईडी खोजने की आवश्यकता होगी जो अद्वितीय होने की भी आवश्यकता है, तो एक सूची का उपयोग क्यों करें और एक सेट नहीं? आप पीछे की ओर प्रोग्रामिंग कर रहे हैं। नौकरी के लिए सही संग्रह का उपयोग करें और अपने आप को इस सिरदर्द से
count()
एक टर्मिनल ऑपरेशन है, इसलिए आप ऐसा नहीं कर सकते। इसके बाद स्ट्रीम का उपयोग नहीं किया जा सकता है।