Khi sử dụng luồng Java8 mới api để tìm một phần tử cụ thể trong bộ sưu tập, tôi viết mã như sau:
String theFirstString = myCollection.stream()
.findFirst()
.get();
Ở đây IntelliJ cảnh báo rằng get () được gọi mà không cần kiểm tra isPftime () trước.
Tuy nhiên, mã này:
String theFirstString = myCollection.iterator().next();
... không mang lại cảnh báo.
Có một số khác biệt sâu sắc giữa hai kỹ thuật, làm cho cách tiếp cận phát trực tuyến trở nên "nguy hiểm" hơn theo một cách nào đó, rằng điều quan trọng là không bao giờ gọi get () mà không gọi isPftime () trước? Googling xung quanh, tôi tìm thấy các bài báo nói về cách các lập trình viên bất cẩn với Tùy chọn <> và cho rằng họ có thể gọi get () bất cứ khi nào.
Điều đó là, tôi muốn có một ngoại lệ ném vào tôi càng gần càng tốt đến nơi mã của tôi bị lỗi, trong trường hợp này sẽ là nơi tôi đang gọi get () khi không tìm thấy phần tử nào. Tôi không muốn phải viết những bài luận vô dụng như:
Optional<String> firstStream = myCollection.stream()
.findFirst();
if (!firstStream.isPresent()) {
throw new IllegalStateException("There is no first string even though I totally expected there to be! <sarcasm>This exception is much more useful than NoSuchElementException</sarcasm>");
}
String theFirstString = firstStream.get();
... Trừ khi có một số nguy hiểm trong việc kích động các ngoại lệ từ get () mà tôi không biết?
Sau khi đọc phản hồi từ Karl Bielefeldt và một nhận xét từ Hulk, tôi nhận ra mã ngoại lệ của tôi ở trên là một chút vụng về, đây là một cái gì đó tốt hơn:
String errorString = "There is no first string even though I totally expected there to be! <sarcasm>This exception is much more useful than NoSuchElementException</sarcasm>";
String firstString = myCollection.stream()
.findFirst()
.orElseThrow(() -> new IllegalStateException(errorString));
Điều này có vẻ hữu ích hơn và có thể sẽ trở nên tự nhiên ở nhiều nơi. Tôi vẫn cảm thấy mình sẽ muốn có thể chọn một yếu tố từ danh sách mà không phải xử lý tất cả những điều này, nhưng điều đó có thể là tôi cần phải làm quen với các loại cấu trúc này.