Scala: Chuyển đổi thanh lịch một chuỗi thành boolean


83

Trong Java, bạn có thể viết Boolean.valueOf(myString). Tuy nhiên trong Scala, java.lang.Booleanbị ẩn bởi scala.Booleanđó thiếu chức năng này. Thật dễ dàng để chuyển sang sử dụng phiên bản Java gốc của boolean, nhưng điều đó có vẻ không đúng.

Vậy giải pháp một dòng, chuẩn trong Scala để trích xuất truetừ một chuỗi là gì?


Tại sao không chỉ sử dụng một biểu thức chính quy?
Kevin Meredith

2
Nghe có vẻ không đơn giản chút nào.
Jaime Hablutzel

Câu trả lời:


143

Ah, tôi thật ngớ ngẩn. Câu trả lời là myString.toBoolean.


9
Nếu myString là null mã của bạn sẽ ném một ngoại lệ, tôi thích cách tiếp cận câu trả lời tiếp theo Try (myString.toBoolean) .getOrElse (false)
Carlos Verdes

2
Try(myString.toBoolean).getOrElse(false)sẽ trải qua công việc ném và bắt ngoại lệ. Option(myString).exists(_.toBoolean)tránh nỗ lực thêm.
sfosdal

1
Sử dụng Try(myString.toBoolean).getOrElse(false)là tốt. Xử lý sạch sẽ chuỗi không khớp.
NKM

109

Còn cái này thì sao:

import scala.util.Try

Try(myString.toBoolean).getOrElse(false)

Nếu chuỗi đầu vào không chuyển đổi thành giá trị Boolean hợp lệ falsesẽ được trả về trái ngược với việc ném ra một ngoại lệ. Hành vi này gần giống với hành vi Java của Boolean.valueOf(myString).


Tôi nghĩ rằng một ngoại lệ là những gì bạn muốn. Điều gì sẽ xảy ra nếu người dùng nhập "1" thay vì "true" hoặc một cái gì đó khác? Cách tiếp cận này sẽ để lại lỗi như vậy không bị phát hiện. Nhưng bây giờ tôi biết về chức năng Thử, điều này thật tuyệt.
user42723 Ngày

14

Scala 2.13được giới thiệu String::toBooleanOption, kết hợp với Option::getOrElse, cung cấp một cách an toàn để trích xuất một Booleandưới dạng String:

"true".toBooleanOption.getOrElse(false)  // true
"false".toBooleanOption.getOrElse(false) // false
"oups".toBooleanOption.getOrElse(false)  // false

11

Lưu ý: Không viết new Boolean(myString)bằng Java - luôn sử dụng Boolean.valueOf(myString). Sử dụng newbiến thể tạo ra một Booleanđối tượng một cách không cần thiết ; sử dụng valueOfbiến thể không làm điều này.


8

Vấn đề với myString.toBooleannó là nó sẽ ném ra một ngoại lệ nếu myString.toLowerCasekhông chính xác là một trong số "true"hoặc "false"(thậm chí khoảng trắng thừa trong chuỗi sẽ gây ra một ngoại lệ được ném ra).

Nếu bạn muốn chính xác hành vi tương tự như java.lang.Boolean.valueOf, sau đó sử dụng nó hoàn toàn đủ điều kiện, hoặc nhập khẩu Boolean dưới một cái tên khác nhau, ví dụ import java.lang.{Boolean=>JBoolean}; JBoolean.valueOf(myString). Hoặc viết phương pháp riêng của mình để xử lý tình huống cụ thể của riêng bạn (ví dụ, bạn có thể muốn "t"truecũng).


1
Điều này không đúng (nữa). toLowerCase is done by toBoolean`
pme

1

Hôm nay tôi rất vui với điều này, ánh xạ một bộ giá trị 1/0 thành boolean. Tôi đã phải hoàn nguyên về Spark 1.4.1 và cuối cùng tôi đã làm cho nó hoạt động với:

Try(if (p(11).toString == "1" || p(11).toString == "true") true else false).getOrElse(false)) 

trong đó p (11) là trường khung dữ liệu

phiên bản trước của tôi không có "Thử", điều này hoạt động, các cách thực hiện khác có sẵn ...


2
Bạn không cần ifvới true else falsebởi vì trả về có điều kiện của bạn truehoặc false. Tất cả những gì bạn cần là Try(condition).getOrElse(false).
jwvh
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.