2012-03-05 35 views
8

Tôi muốn xác định một hàm:Làm thế nào để chuyển đổi một số ("") thành Không có trong một dòng?

def convert(x: Option[String]): Option[String] = ... 

Khi xSome(str)str là trống sau khi cắt tỉa, nó sẽ được chuyển đổi sang một None, nếu không, nó sẽ là một Some với chuỗi tỉa.

Vì vậy, các trường hợp thử nghiệm sẽ là:

convert(Some("")) == None 
convert(Some(" ")) == None 
convert(None) == None 
convert(Some(" abc ")) == Some("abc") 

tôi có thể viết nó như:

def convert(x: Option[String]): Option[String] = x match { 
    case Some(str) if str.trim()!="" => Some(str.trim()) 
    case _ => None 
} 

Nhưng tôi hy vọng sẽ tìm thấy một thực hiện đơn giản hơn (một dòng).

+3

Bạn có thiếu một số ký tự dòng mới trong môi trường của mình không? Bạn có được thanh toán tỷ lệ nghịch với số dòng bạn viết không? Lời khuyên của tôi là chỉ sử dụng phiên bản hai dòng và ngừng làm việc cho chính mình :-) – paxdiablo

+1

Tôi chỉ muốn làm cho mã của mình đơn giản và rõ ràng – Freewind

+1

@paxdiablo: Đó là một câu hỏi hợp lệ vì ví dụ thực sự có thể được cải thiện: Mã chạy 'str.trim' hai lần rõ ràng là một cái gì đó để tránh. – Debilski

Trả lời

15

gì về điều này:

def convert(x: Option[String]) = 
    x.map(_.trim()).filterNot(_.isEmpty()) 

UPDATE: cú pháp thay thế được đề xuất bởi @JamesMoore@PeterSchmitz:

x map {_.trim} filterNot {_.isEmpty} 
x map (_.trim) filterNot (_.isEmpty) 
+0

Xin lỗi, 'chuyển đổi (Một số (" abc "))! = Một số (" abc ")' – Freewind

+0

@Freewind: xin lỗi của tôi, bây giờ phải chính xác. –

+4

Tôi nghĩ rằng nó dễ đọc hơn nếu bạn bỏ parens: x map {\ _. Trim} filterNot {\ _. IsEmpty} –

1

Và như thường lệ cũng là cú pháp thay thế sự hiểu biết (là đường cú pháp cho bộ lọc và bản đồ)

def convert(o: Option[String]): Option[String] = 
    for (x <- o if !x.isEmpty) yield x 
+1

Giống như cú pháp cú pháp –

1

def chuyển đổi (x: Option [String]) = x.filter (s => s.trim.nonEmpty)

Các vấn đề liên quan