Cách được chấp nhận nhất để chuyển đổi boolean
thành một int
trong Java là gì?
Cách được chấp nhận nhất để chuyển đổi boolean
thành một int
trong Java là gì?
Câu trả lời:
int myInt = myBoolean ? 1 : 0;
^^
PS: đúng = 1 và sai = 0
(foo && (!bar || baz)) ? 1 : 0
. Rõ ràng, nếu nó chỉ là một định danh, thì các parens không cần thiết hoặc không mong muốn.
(boolean expression) ? 1 : 0;
sẽ dễ hiểu hơn. Tôi nghĩ my
tiền tố làm cho nó trông giống như một biến.
foo && (!bar || baz) ? 1 : 0
sẽ là một lỗi cú pháp. (Tôi biết đã 6 năm rồi)
Sử dụng toán tử ternary là cách đơn giản nhất, hiệu quả nhất và dễ đọc nhất để làm những gì bạn muốn. Tôi khuyến khích bạn sử dụng giải pháp này.
Tuy nhiên, tôi không thể cưỡng lại việc đề xuất một giải pháp thay thế, không có hiệu quả, không thể đọc được.
int boolToInt(Boolean b) {
return b.compareTo(false);
}
Hey, mọi người thích bỏ phiếu cho câu trả lời tuyệt vời như vậy!
Biên tập
Nhân tiện, tôi thường thấy các chuyển đổi từ boolean sang int với mục đích duy nhất là thực hiện so sánh hai giá trị (nói chung, trong việc triển khai compareTo
phương thức). Boolean#compareTo
là cách để đi trong những trường hợp cụ thể.
Chỉnh sửa 2
Java 7 đã giới thiệu một hàm tiện ích mới hoạt động trực tiếp với các kiểu nguyên thủy, Boolean#compare
(Cảm ơn shmosel )
int boolToInt(boolean b) {
return Boolean.compare(b, false);
}
Boolean.compare()
và tránh hộp số tự động. 2. Tài liệu cho Boolean.compareTo()
biết nó sẽ không trả về 1, chỉ "giá trị dương nếu đối tượng này đại diện cho đúng và đối số đại diện cho sai".
boolean b = ....;
int i = -("false".indexOf("" + b));
5 - b.toString().length
import org.apache.commons.lang3.BooleanUtils;
boolean x = true;
int y= BooleanUtils.toInteger(x);
BooleanUtils.toInteger
được thực hiện như chỉ return bool ? 1 : 0;
.
Điều đó phụ thuộc vào tình hình. Thường thì cách tiếp cận đơn giản nhất là tốt nhất vì nó dễ hiểu:
if (something) {
otherThing = 1;
} else {
otherThing = 0;
}
hoặc là
int otherThing = something ? 1 : 0;
Nhưng đôi khi nó hữu ích khi sử dụng Enum thay vì cờ boolean. Hãy tưởng tượng có các quy trình đồng bộ và không đồng bộ:
Process process = Process.SYNCHRONOUS;
System.out.println(process.getCode());
Trong Java, enum có thể có các thuộc tính và phương thức bổ sung:
public enum Process {
SYNCHRONOUS (0),
ASYNCHRONOUS (1);
private int code;
private Process (int code) {
this.code = code;
}
public int getCode() {
return code;
}
}
?:
là bạn có thể đặt các điểm dừng bên trong các khối if.
Nếu bạn sử dụng Apache Commons Lang (mà tôi nghĩ rằng rất nhiều dự án sử dụng nó), bạn có thể sử dụng nó như thế này:
int myInt = BooleanUtils.toInteger(boolean_expression);
toInteger
phương thức trả về 1 nếu boolean_expression
đúng, 0 nếu không
BooleanUtils.toInteger
được thực hiện như chỉ return bool ? 1 : 0;
.
Nếu bạn muốn làm xáo trộn, hãy sử dụng điều này:
System.out.println( 1 & Boolean.hashCode( true ) >> 1 ); // 1
System.out.println( 1 & Boolean.hashCode( false ) >> 1 ); // 0
Hãy chơi trò lừa với Boolean.compare(boolean, boolean)
. Hành vi mặc định của hàm: nếu cả hai giá trị bằng nhau thì nó trả về 0
khác -1
.
public int valueOf(Boolean flag) {
return Boolean.compare(flag, Boolean.TRUE) + 1;
}
Giải thích : Như chúng ta đã biết tỷ lệ trả về mặc định của Boolean.compare là -1 trong trường hợp khớp sai, do đó +1 tạo giá trị trả về 0 cho False
và 1 choTrue
Boolean.compare(myBoolean, false)
sẽ phù hợp hơn với sự phù hợp với mô tả được trích dẫn
Thực tế là tôi phải viết một phương thức bao bọc xung quanh một câu lệnh if để truyền giá trị chỉ thêm vào danh sách lớn lý do tại sao java nên chết. Và nhìn thấy toán tử ternary thậm chí không được bao bọc trong một hàm mà chỉ sao chép được dán ở khắp mọi nơi, tôi thấy một boolean cast để int chỉ khiến tôi phát điên. Thật lãng phí chu kỳ cpu và xúc phạm đến khả năng đọc mã.
Ngoài ra hầu hết các câu trả lời ở đây có hàng trăm câu trả lời với lời giải thích bằng không, điều này khiến tôi đoán rằng thực tiễn xấu chỉ là kết quả của việc tiếp xúc với java rất nhiều. Nếu tôi viết một toán tử ternary để chuyển boolean sang int bằng bất kỳ ngôn ngữ hiện đại nào, tôi sẽ bị đuổi việc vào ngày hôm sau từ bất kỳ công việc nào tôi có thể có. Vì vậy, hôm nay tôi đã từ bỏ việc cố gắng sử dụng lý do với các bài tập java của mình và quyết định chấp nhận sự ngu ngốc:
public static int booltoint(boolean nonsense) {
// Let's start with indenting using spaces, 16 of them to be precise
String[] ____int = new String[500];
____int[0] = Boolean.toString(nonsense);
try {
Thread.sleep(100);
} catch (Exception e) { }
Random rand = new Random();
int n = rand.nextInt((int)1e9);
int result = 0;
int other_Result = 1;
for (int i = -5; i < 2; i++) {
try {
if (n == 35467247) return 5; // let's just fail with one in a billion chance
if ((5 - ____int[i].length()) == 1) {
return ++result;
} else if(____int[i] == "false") {
return --other_Result;
}
} catch (Exception e) {
// This method will throw an exception 5 times every single time I
// cast a boolean to int before returning an integer
}
}
return (int)1e35;}
true
vàfalse
tương ứng?