2015-02-04 16 views
20

Cho một chuỗi Tôi cần phải có một tùy chọn, theo đó nếu chuỗi là null hoặc rỗng kết quả sẽ là Optional.empty. Tôi có thể thực hiện theo cách này:Trong Java 8, chuyển đổi tùy chọn <String> của một chuỗi rỗng trong Optional.empty

String ppo = ""; 
Optional<String> ostr = Optional.ofNullable(ppo); 
if (ostr.isPresent() && ostr.get().isEmpty()) { 
    ostr = Optional.empty(); 
} 

Nhưng chắc chắn phải có cách thanh lịch hơn.

+0

Nếu bạn có thể sống với nó trở về một String rỗng thay vì Optional.empty bạn có thể làm điều này: Optional.ofNullable (ppo) .orElse (""); – acvcu

Trả lời

45

Bạn có thể sử dụng một bộ lọc:

Optional<String> ostr = Optional.ofNullable(ppo).filter(s -> !s.isEmpty()); 

Điều đó sẽ trả về một Tùy chọn sản phẩm nào nếu ppo là null hoặc rỗng.

+1

Giả sử cho biến vị ngữ, bạn có thể chỉ định 'negate (String :: isEmpty)' làm phương án thay thế? (Với một nhập khẩu tĩnh của 'Predicate.negate'.) Tôi thích nó. –

+0

Thật không may nó không phải là một phương pháp tĩnh. Vì vậy, bạn sẽ cần phải bỏ 'String :: empty' vào một Predicate rồi phủ nhận nó. Khá khó chịu phải thừa nhận! – assylias

+0

Sẽ không ném NullPointerException nếu ppo là null? – Eran

4

Làm thế nào về:

Optional<String> ostr = ppo == null || ppo.isEmpty() 
    ? Optional.empty() 
    : Optional.of(ppo); 

Bạn có thể đặt rằng trong một phương pháp hữu ích nếu bạn cần nó thường, tất nhiên. Tôi thấy không có lợi trong việc tạo ra một Optional với một chuỗi rỗng, chỉ sau đó bỏ qua nó.

+0

@assylias: Đã sửa lỗi. Nó không bao giờ rõ ràng với tôi trong Java cách suy luận kiểu làm việc với toán tử điều kiện. (Hay đúng hơn, tôi không bao giờ nhớ ...) –

+1

Với Java 8 nó đã trở nên rất hiếm hoi mà bạn cần nó. – assylias

2

Bạn có thể sử dụng bản đồ:

String ppo=""; 
Optional<String> ostr = Optional.ofNullable(ppo) 
           .map(s -> s.isEmpty()?null:s); 
System.out.println(ostr.isPresent()); // prints false 
7

Với Apache Commons:

.filter(StringUtils::isNotEmpty) 
0

Nếu bạn sử dụng ổi, bạn chỉ có thể làm:

Optional<String> ostr = Optional.ofNullable(Strings.emptyToNull(ppo)); 
Các vấn đề liên quan