Trong Java 8, tôi muốn làm một cái gì đó cho một Optional
đối tượng nếu nó có mặt và làm một điều khác nếu nó không có mặt.
if (opt.isPresent()) {
System.out.println("found");
} else {
System.out.println("Not found");
}
Đây không phải là một "phong cách chức năng", mặc dù.
Optional
có một ifPresent()
phương thức, nhưng tôi không thể xâu chuỗi một orElse()
phương thức.
Vì vậy, tôi không thể viết:
opt.ifPresent( x -> System.out.println("found " + x))
.orElse( System.out.println("NOT FOUND"));
Trả lời @assylias, tôi không nghĩ sẽ Optional.map()
hoạt động cho trường hợp sau:
opt.map( o -> {
System.out.println("while opt is present...");
o.setProperty(xxx);
dao.update(o);
return null;
}).orElseGet( () -> {
System.out.println("create new obj");
dao.save(new obj);
return null;
});
Trong trường hợp này, khi opt
có mặt, tôi cập nhật thuộc tính của nó và lưu vào cơ sở dữ liệu. Khi nó không có sẵn, tôi tạo một cái mới obj
và lưu vào cơ sở dữ liệu.
Lưu ý trong hai lambdas tôi phải trở lại null
.
Nhưng khi opt
có mặt, cả hai lambdas sẽ bị xử tử. obj
sẽ được cập nhật và một đối tượng mới sẽ được lưu vào cơ sở dữ liệu. Điều này là do return null
trong lambda đầu tiên. Và orElseGet()
sẽ tiếp tục thực thi.
return null;
bằng return o;
(cả hai). Tuy nhiên, tôi có cảm giác mạnh mẽ rằng bạn đang làm việc không đúng chỗ. Bạn nên làm việc tại trang web sản xuất ra điều đó Optional
. Tại nơi đó nên có một cách để thực hiện các hoạt động mong muốn mà không cần trung gian Optional
.
ifPresent
mâu thuẫn này. Tất cả các phương pháp khác đề cập đến giá trị và không hành động.