Ada banyak hal baru yang berguna di Java 8. Misalnya, saya bisa beralih dengan aliran ke daftar objek dan kemudian menjumlahkan nilai dari bidang tertentu dari Object
instance. Misalnya
public class AClass {
private int value;
public int getValue() { return value; }
}
Integer sum = list.stream().mapToInt(AClass::getValue).sum();
Jadi, saya bertanya apakah ada cara untuk membangun String
yang menggabungkan output toString()
metode dari instance dalam satu baris.
List<Integer> list = ...
String concatenated = list.stream().... //concatenate here with toString() method from java.lang.Integer class
Misalkan list
mengandung bilangan bulat 1
, 2
dan 3
, saya berharap bahwa concatenated
ini "123"
atau "1,2,3"
.
java-8
java-stream
mat_boy
sumber
sumber
Jawaban:
Salah satu cara sederhana adalah menambahkan item daftar Anda di a
StringBuilder
Anda juga dapat mencoba:
Penjelasan: map mengubah Integer stream ke String stream, lalu dikurangi sebagai gabungan semua elemen.
Catatan: Ini
normal reduction
yang tampil di O (n 2 )untuk kinerja yang lebih baik gunakan
StringBuilder
ataumutable reduction
mirip dengan jawaban F. Böller.Ref: Stream Reduction
sumber
join
di sisi lain akan mengalokasikan satu array yang cukup besar untuk menyimpan string terakhir sebelum mengisinya, menjadikannya O (n).list.stream().map(Object::toString).reduce("", String::concat)
. Penggunaannyamap e-> e.toString()
sedikit berlebihan.Ada seorang kolektor
joining
di API. Ini metode statis diCollectors
.Tidak sempurna karena panggilan yang diperlukan
toString
, tetapi berhasil. Pembatas yang berbeda dimungkinkan.sumber
import static java.util.stream.Collectors.joining;
Kalau-kalau ada orang yang mencoba melakukan ini tanpa java 8, ada trik yang cukup bagus. List.toString () sudah mengembalikan koleksi yang terlihat seperti ini:
[1,2,3]
Bergantung pada persyaratan spesifik Anda, ini dapat diproses pasca-apa pun yang Anda inginkan asalkan item daftar Anda tidak mengandung [] atau,.
Misalnya:
atau jika data Anda mungkin mengandung tanda kurung:
akan memberi Anda hasil yang cukup masuk akal.
Satu item array pada setiap baris dapat dibuat seperti ini:
Saya menggunakan teknik ini untuk membuat html tooltips dari daftar di aplikasi kecil, dengan sesuatu seperti:
Jika Anda memiliki array maka mulailah dengan Arrays.asList (daftar) .toString () sebagai gantinya
Saya akan benar-benar memiliki fakta bahwa ini tidak optimal, tetapi tidak seefisien yang Anda kira dan cukup mudah untuk dibaca dan dipahami. Namun, ini cukup tidak fleksibel - khususnya tidak mencoba untuk memisahkan elemen dengan replaceAll jika data Anda mungkin mengandung koma dan menggunakan versi substring jika Anda memiliki tanda kurung siku dalam data Anda, tetapi untuk array angka itu cukup banyak sempurna.
sumber
List
tidak menegakkan strukturtoString()
.AbstractCollection
Namun, memang menggunakan struktur ini secara default, dan saya pikir semuaList
implementasi tujuan umum di Jawa SE juga. Sebagai contoh yang tidak,org.springframework.util.AutoPopulatingList
di Spring tidak menerapkantoString()
dan dengan demikian akan mengembalikan misalnya "org.springframework.util.AutoPopulatingList@170a1
".Arrays.toString()
akan menjadi pilihan yang lebih baik daripadaArrays.asList(list).toString()
, karena didefinisikan untuk mengembalikan string yang setara, itu lebih ringkas, dan itu tidak memerlukan penciptaan objek tambahan.Jawaban lainnya baik-baik saja. Namun, Anda juga bisa meneruskan Collectors.toList () sebagai parameter ke Stream.collect () untuk mengembalikan elemen sebagai ArrayList.
sumber
System.out.print
(ln)(list)
ia akan menggunakantoString()
metode elemen untuk mencetak daftar. Jadi, kode ini hanya mengulangi apa yang terjadi di dalamtoString
Daftar.StringListName = ObjectListName.stream (). Map (m -> m.toString ()) .collect (Collectors.toList ());
sumber
Ada metode dalam API String untuk penggunaan kata sandi "bergabung dengan string", Anda bahkan tidak perlu Stream.
sumber
Atau
Pendekatan ini memungkinkan Anda juga membangun hasil string dari daftar objek Contoh
Di sini fungsi pengurangan memungkinkan Anda untuk memiliki beberapa nilai awal yang ingin Anda tambahkan string baru Contoh:
sumber
Menguji kedua pendekatan yang disarankan di Shail016 dan jawaban bpedroso ( https://stackoverflow.com/a/24883180/2832140 ), yang sederhana
StringBuilder
+append(String)
dalam satufor
lingkaran, tampaknya mengeksekusi jauh lebih cepat daripadalist.stream().map([...]
.Contoh: Kode ini berjalan melalui
Map<Long, List<Long>>
string json build, menggunakanlist.stream().map([...]
:Di VM dev saya, junit biasanya membutuhkan waktu antara 0,35 dan 1,2 detik untuk menjalankan tes. Sementara, menggunakan kode berikut ini, dibutuhkan antara 0,15 dan 0,33 detik:
sumber
Bisakah kita coba ini?
sumber
sumber
List
menjadi satuString
dan memisahkan setiap elemen dengan koma (,
).Saya akan menggunakan api stream untuk mengubah aliran bilangan bulat menjadi satu string. Masalah dengan beberapa jawaban yang diberikan adalah bahwa mereka menghasilkan runtime O (n ^ 2) karena pembangunan String. Solusi yang lebih baik adalah dengan menggunakan StringBuilder, dan kemudian bergabung dengan string sebagai langkah terakhir.
Anda dapat mengambil proses ini selangkah lebih maju dengan mengubah koleksi objek menjadi string tunggal.
sumber
Dengan Java 8+
Bukan yang paling efisien, tetapi ini adalah solusi dengan sejumlah kecil kode.
sumber
Anda juga bisa melakukan ini.
sumber