Chuyển đổi chuỗi thành int hoặc Integer trong Java

1. Giới thiệu

Chuyển đổi một chuỗi thành int hoặc Integer là một hoạt động rất phổ biến trong Java. Trong bài viết này, chúng tôi sẽ chỉ ra nhiều cách xử lý vấn đề này.

Có một số cách đơn giản để giải quyết chuyển đổi cơ bản này.

2. Integer.parseInt ()

Một trong những giải pháp chính là sử dụng phương thức tĩnh chuyên dụng của Integer : parseInt () , trả về giá trị int nguyên thủy :

@Test public void givenString_whenParsingInt_shouldConvertToInt() { String givenString = "42"; int result = Integer.parseInt(givenString); assertThat(result).isEqualTo(42); }

Theo mặc định, phương thức parseInt () giả sử Chuỗi đã cho là một số nguyên cơ số 10. Ngoài ra, phương thức này chấp nhận một đối số khác để thay đổi cơ số mặc định này . Ví dụ, chúng ta có thể phân tích cú pháp chuỗi nhị phân như sau:

@Test public void givenBinaryString_whenParsingInt_shouldConvertToInt() { String givenString = "101010"; int result = Integer.parseInt(givenString, 2); assertThat(result).isEqualTo(42); }

Đương nhiên, cũng có thể sử dụng phương pháp này với bất kỳ cơ số nào khác như 16 (hệ thập lục phân) hoặc 8 (hệ bát phân).

3. Integer.valueOf ()

Một tùy chọn khác sẽ là sử dụng phương thức Integer.valueOf () tĩnh , trả về một cá thể Integer :

@Test public void givenString_whenCallingIntegerValueOf_shouldConvertToInt() { String givenString = "42"; Integer result = Integer.valueOf(givenString); assertThat(result).isEqualTo(new Integer(42)); }

Tương tự, phương thức valueOf () cũng chấp nhận một cơ số tùy chỉnh làm đối số thứ hai:

@Test public void givenBinaryString_whenCallingIntegerValueOf_shouldConvertToInt() { String givenString = "101010"; Integer result = Integer.valueOf(givenString, 2); assertThat(result).isEqualTo(new Integer(42)); }

3.1. Bộ nhớ đệm số nguyên

Thoạt nhìn, có vẻ như phương thức valueOf ()parseInt () hoàn toàn giống nhau. Đối với hầu hết các phần, điều này là đúng - ngay cả phương thức valueOf () ủy nhiệm cho phương thức parseInt bên trong.

Tuy nhiên, có một sự khác biệt tinh tế giữa hai phương pháp: các valueOf () phương pháp được sử dụng một bộ nhớ cache nguyên nội bộ . Bộ nhớ cache này sẽ trả về cùng một phiên bản Integer cho các số từ -128 đến 127 :

@Test public void givenString_whenCallingValueOf_shouldCacheSomeValues() { for (int i = -128; i <= 127; i++) { String value = i + ""; Integer first = Integer.valueOf(value); Integer second = Integer.valueOf(value); assertThat(first).isSameAs(second); } }

Do đó, chúng tôi rất khuyến khích sử dụng valueOf () thay vì parseInt () để trích xuất các số nguyên được đóng hộp vì nó có thể dẫn đến dấu ấn tổng thể tốt hơn cho ứng dụng của chúng tôi.

4. Hàm tạo của Integer

Bạn cũng có thể sử dụng hàm tạo của Integer :

@Test public void givenString_whenCallingIntegerConstructor_shouldConvertToInt() { String givenString = "42"; Integer result = new Integer(givenString); assertThat(result).isEqualTo(new Integer(42)); }

Kể từ Java 9, phương thức khởi tạo này đã không còn được sử dụng để thay thế cho các phương thức nhà máy tĩnh khác như valueOf () hoặc parseInt () . Ngay cả trước khi không được dùng nữa, hiếm khi sử dụng hàm tạo này. Chúng ta nên sử dụng parseInt () để chuyển đổi một chuỗi thành int nguyên thủy hoặc sử dụng valueOf () để chuyển nó thành đối tượng Integer .

5. Integer.decode ()

Ngoài ra, Integer.decode () hoạt động tương tự như Integer.valueOf (), nhưng cũng có thể chấp nhận các biểu diễn số khác nhau:

@Test public void givenString_whenCallingIntegerDecode_shouldConvertToInt() { String givenString = "42"; int result = Integer.decode(givenString); assertThat(result).isEqualTo(42); }

6. NumberFormatException

Tất cả các phương thức được đề cập ở trên đều ném ra một NumberFormatException, khi gặp các giá trị Chuỗi không mong muốn . Ở đây bạn có thể xem một ví dụ về tình huống như vậy:

@Test(expected = NumberFormatException.class) public void givenInvalidInput_whenParsingInt_shouldThrow() { String givenString = "nan"; Integer.parseInt(givenString); }

7. Với ổi

Tất nhiên, chúng ta không cần phải bám vào chính Java cốt lõi. Đây là cách điều tương tự có thể đạt được bằng cách sử dụng Ints.tryParse () của Guava , trả về giá trị null nếu nó không thể phân tích cú pháp đầu vào:

@Test public void givenString_whenTryParse_shouldConvertToInt() { String givenString = "42"; Integer result = Ints.tryParse(givenString); assertThat(result).isEqualTo(42); }

Hơn nữa, phương thức tryParse () cũng chấp nhận đối số cơ số thứ hai tương tự như parseInt ()valueOf ().

8. Kết luận

Trong bài viết này, chúng tôi đã khám phá nhiều cách chuyển đổi cá thể Chuỗi thành cá thể int hoặc Integer .

Tất nhiên, tất cả các ví dụ về mã đều có thể được tìm thấy trên GitHub.