Apakah ini cara yang benar untuk mengubah char ke String di Java? [duplikat]

20

Saat menulis unit tes untuk fungsi pengembalian booleanyang membutuhkan dua Strings, dan saya perlu menguji setiap karakter alfabet ( 'a'- 'z') secara berurutan sebagai salah satu parameter, satu-per-satu, jadi saya menulis ini untuk melakukan itu:

for(char c = 'a'; c <= 'z'; c++)
{
    assertTrue(MyClass.MyFunction(testSubject, new String(c));
} 

Saya akan berpikir ini diperbolehkan, tetapi tidak, jadi saya hanya melakukannya seperti ini:

for(char c = 'a'; c <= 'z'; c++)
{
    assertTrue(MyClass.MyFunction(testSubject, ((Character) c).toString());
} 

Apakah ini metode yang dapat diandalkan untuk mengonversi a charke Stringdalam Java? Apakah ini cara yang disukai? Saya tidak tahu banyak tentang Java, jadi saya ingin klarifikasi tentang ini.

Govind Parmar
sumber
2
Tidak langsung ke pertanyaan Anda, tapi saya akanIntStream.range(0, 26).mapToObj(i -> Character.toString((char) ('a' + i))).forEach(x -> assertTrue(MyClass.MyFunction(testSubject, x)));
Elliott Frisch
3
@ ElliottFrisch tapi mengapa? Streaming tidak diperlukan di sini, tetapi bahkan jika Anda bersikeras menggunakan stream untuk setiap loop, mengapa tidak menggunakan setidaknya IntStream.rangeClosed('a', 'z')?
PhilipRoman
1
Tidak ada cara 'benar' tunggal. Mungkin ada setidaknya lima cara untuk melakukan ini: yang Anda pilih tergantung pada mode sebanyak fakta ilmiah. Sebagian besar waktu itu tidak masalah, dan program pengujian tentu saja merupakan salah satu kasus itu.
user207421
@PhilipRoman Karena ada di sana (Edmund Hillary). Karena aku bisa. Karena kami ingin (Billie Piper, saya pikir). Itu pendekatan yang keren juga.
Elliott Frisch
Saya akan berpikir ini diizinkan. Anda pikir diizinkan untuk memanggil Stringkonstruktor yang tidak ada? Koreksi saya jika saya salah, tetapi sejauh yang saya ketahui, tidak ada konstruktor di kelas Stringyang mengambil charargumen tunggal . Perhatikan bahwa chartidak sama dengan char[].
Abra

Jawaban:

33

Solusi terpendek:

char c = 'a';
String s = "" + c;

Solusi terbersih (dan mungkin paling efisien 1 ):

char c = 'a';

String s1 = String.valueOf(c);
// or
String s2 = Character.toString(c);

Dibandingkan dengan pendekatan Anda, hal di atas mencegah overhead karena harus mengotakkan primitif menjadi Characterobjek.


1 Sedikit inefisiensi rangkaian string dalam pendekatan pertama mungkin dioptimalkan oleh kompiler atau runtime, jadi satu (jika ada yang cenderung) benar-benar harus menjalankan micro-benchmark untuk menentukan kinerja aktual. Optimalisasi mikro seperti ini jarang sepadan, dan mengandalkan penggabungan untuk memaksa konversi string tidak terlihat bagus.

Robby Cornelissen
sumber
6
Terakhir kali saya melihat, javackompiler Sun secara otomatis berubah String s = "" + c;menjadi String s = String.valueOf(c);, jadi kinerjanya akan sama.
Neil
4
@Neil Whew! Saya mulai berpikir bahwa tipe orang yang saya tulis di catatan kaki itu sudah tidak ada lagi di Stack Overflow :)
Robby Cornelissen