ฉันกำลังพยายามที่จะใช้ Java 8 เพื่อหาองค์ประกอบในStream
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
ตาม ID ของพวกเขา แต่ไม่มีการรับประกันว่าจะมีจำนวนเท่าใดUser
ที่ตรงกับตัวกรอง
การเปลี่ยนบรรทัดตัวกรองเป็น:
User match = users.stream().filter((user) -> user.getId() < 0).findAny().get();
จะโยนNoSuchElementException
(ดี!)
ฉันต้องการให้เกิดข้อผิดพลาดหากมีการแข่งขันหลายรายการ มีวิธีทำเช่นนี้หรือไม่?
Stream::size
?
Stream
มากขึ้นกว่าที่ฉันเคยทำมาก่อน ...
LinkedHashSet
(สมมติว่าคุณต้องการเก็บรักษาคำสั่งการแทรก) หรือHashSet
ทั้งหมด หากคอลเล็กชันของคุณใช้เพื่อค้นหา ID ผู้ใช้เดียวดังนั้นทำไมคุณจึงรวบรวมรายการอื่นทั้งหมด หากมีความเป็นไปได้ที่คุณจะต้องค้นหา ID ผู้ใช้ที่จำเป็นต้องมีเอกลักษณ์อยู่เสมอทำไมจึงใช้รายการและไม่ได้ตั้งค่า คุณกำลังเขียนโปรแกรมย้อนหลัง ใช้คอลเล็กชันที่เหมาะสมสำหรับงานและช่วยตัวเองด้วยอาการปวดหัวนี้
count()
เป็นการทำงานของเครื่องปลายทางดังนั้นคุณจึงไม่สามารถทำได้ ไม่สามารถใช้สตรีมได้ในภายหลัง