Kiểm tra 'Optional.get ()' không có 'isPresent ()'


89

Tôi có mã tìm kiếm sau trong Java:

return getTableViewController().getMe().getColumns().stream().filter($->Database.equalsColumnName($.getId(), columnId)).findFirst().get();

Tôi đã muốn tìm cột theo tên và trả lại cột đầu tiên được tìm thấy.

Tôi hiểu có trường hợp không tìm thấy gì và cần xử lý như thế nào?

Đây có phải là những gì nó muốn bởi lời thề này:

'Optional.get()' without 'isPresent()' check

?

Làm thế nào để khắc phục? Tôi muốn quay lại nullnếu không tìm thấy gì.

CẬP NHẬT

Được rồi, được rồi, tôi không nhận ra, điều đó findFirst()sẽ trở lại Optional.


2
Lưu ý rằng bạn không nên sử dụng $làm mã định danh trong Java: JLS Sec 3.8 : "Dấu $ chỉ nên được sử dụng trong mã nguồn được tạo một cách cơ học hoặc hiếm khi để truy cập các tên có sẵn trên các hệ thống kế thừa."
Andy Turner

Câu trả lời:


181

Thay thế get()bằng orElse(null).


1
Tại sao? :) Tại sao orElsebắt đầu bằng "hoặc"?
Dims

15
Vì đó là tên phương thức. Và elselà một từ khóa.
Andy Turner

8
@Dims chỉ là một dạng ngắn gọn của getOrElse, chỉ cần bỏ qua. Với tùy chọn, bạn thường nên sử dụng orElsethay getvì vì getsẽ ném ra một ngoại lệ nếu giá trị là null.
puhlen

4
@puhlen orElseGet()mất a Supplier<T>, trong khi orElse()mất a T. Đây không phải là tương đương.
bcsb1001

1
@ bcsb1001 đó không phải là những gì anh ấy cố gắng nói, "getOrElse" là một cái tên mà anh ấy đã phát minh ra để giải thích mục đích của nó orElse; không có tham chiếu đến orElseGettrong bình luận của anh ấy;)
Rorrim

22
...findFirst().orElse(null);

Trả về giá trị nếu có, nếu không thì trả về null. Tài liệu nói rằng tham số được truyền vào có thể là null(những gì bị cấm orElseGetorElseThrow).


1
điều đó đúng một phần. findFirst () có quy tắc sau: "Khi không có lệnh gặp, nó trả về bất kỳ phần tử nào từ Luồng." -> vì vậy nếu bộ lọc của bạn không trả lại các yếu tố phù hợp, FindFirst () sẽ trở lại là người đầu tiên (trừ dòng trống trước)
Fl0R1D3R

1

giải pháp của tôi là kiểm tra nó theo cách này

if(item.isPresent()){
  item.get().setId("1q2w3e4r5t6y")
}

0

Tùy chọn đã được tạo để mã có thể sau tất cả những thập kỷ này, cuối cùng bắt đầu tránh null.

Xóa .get (), trả lại chính Tùy chọn và làm cho mã gọi đối phó với nó một cách thích hợp (giống như nó sẽ phải làm trong trường hợp bạn trả về null).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.