Tôi đang cố gắng sử dụng Java 8 Stream
để tìm các phần tử trong a LinkedList
. Tôi muốn đảm bảo, tuy nhiên, có một và chỉ một phù hợp với tiêu chí lọc.
Lấy mã này:
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;
}
}
Mã này tìm thấy User
dựa trên ID của họ. Nhưng không có gì đảm bảo có bao nhiêu User
s khớp với bộ lọc.
Thay đổi dòng bộ lọc thành:
User match = users.stream().filter((user) -> user.getId() < 0).findAny().get();
Sẽ ném một NoSuchElementException
(tốt!)
Tôi muốn nó ném một lỗi nếu có nhiều trận đấu, mặc dù. Có cách nào để làm việc này không?
Stream::size
?
Stream
nhiều hơn những gì tôi đã làm trước đây ...
LinkedHashSet
(giả sử bạn muốn giữ trật tự chèn) hoặc HashSet
tất cả cùng. Nếu bộ sưu tập của bạn chỉ được sử dụng để tìm một id người dùng, vậy tại sao bạn lại thu thập tất cả các mục khác? Nếu có một tiềm năng mà bạn sẽ luôn cần tìm một số id người dùng cũng cần phải là duy nhất, thì tại sao lại sử dụng danh sách mà không phải là một tập hợp? Bạn đang lập trình ngược. Sử dụng bộ sưu tập phù hợp cho công việc và tự cứu mình khỏi cơn đau đầu này
count()
là một hoạt động thiết bị đầu cuối vì vậy bạn không thể làm điều đó. Luồng không thể được sử dụng sau.