Saat menulis unit tes untuk fungsi pengembalian boolean
yang membutuhkan dua String
s, 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 char
ke String
dalam Java? Apakah ini cara yang disukai? Saya tidak tahu banyak tentang Java, jadi saya ingin klarifikasi tentang ini.
IntStream.range(0, 26).mapToObj(i -> Character.toString((char) ('a' + i))).forEach(x -> assertTrue(MyClass.MyFunction(testSubject, x)));
IntStream.rangeClosed('a', 'z')
?String
konstruktor yang tidak ada? Koreksi saya jika saya salah, tetapi sejauh yang saya ketahui, tidak ada konstruktor di kelasString
yang mengambilchar
argumen tunggal . Perhatikan bahwachar
tidak sama denganchar[]
.Jawaban:
Solusi terpendek:
Solusi terbersih (dan mungkin paling efisien 1 ):
Dibandingkan dengan pendekatan Anda, hal di atas mencegah overhead karena harus mengotakkan primitif menjadi
Character
objek.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.
sumber
javac
kompiler Sun secara otomatis berubahString s = "" + c;
menjadiString s = String.valueOf(c);
, jadi kinerjanya akan sama.