Untuk membersihkan daftar data, saya telah membuat metode yang menerima daftar data dan daftar operasi pembersihan yang harus dilakukan.
public <T> List<T> cleanData(List<T> data, List<Function<T, T>> cleanOps) {
List<T>dataNew=data.stream().map((str) -> {
T cleanData = str;
for(Function<T,T> function:cleanOps) {
cleanData=function.apply(cleanData);
}
return cleanData;
}).collect(Collectors.toList());
return dataNew;
}
Masalahnya di sini adalah bahwa kami membuat seluruh daftar lagi sebagai Collectors.toList()
mengembalikan daftar baru. Bisakah kita mencapai hasil yang sama tanpa menggunakan ruang ekstra?
Di bawah ini adalah kode untuk doa:
public void processData() {
List<Function<String, String>> cleanOps = new ArrayList<>();
cleanOps.add(String::toLowerCase);
cleanOps.add(str -> str.replaceAll(" ", ""));
List<String> data = new ArrayList<>();
data.add("John Doe");
data.add("Jane Doe");
System.out.println(Arrays.toString(cleanData(data, cleanOps).toArray()));
}
java
java-8
functional-programming
java-stream
Dharmvir Tiwari
sumber
sumber
toList()
mengembalikanCollector
bukanList
, dan tidak: Anda tidak dapat memiliki "data ekstra" tanpa "ruang ekstra"Jawaban:
Jika memodifikasi daftar di tempat diperbolehkan, Anda bisa menggunakan
andThen
menggabungkan duaFunction
instance dan jika setidaknya satu fungsi hadir, yaitucleanOps
daftar tidak kosong, fungsi gabungan yang dihasilkan akan diterapkan ke semua elemen daftar dan elemen diganti dengan hasil, menggunakanreplaceAll
.Sayangnya,
replaceAll
membutuhkan yangUnaryOperator<T>
alih - alihFunction<T,T>
, meskipun secara fungsional setara, jadi kita harus menggunakan adaptorf::apply
.Karena tipe fungsi ini setara, kita dapat mengubah daftar
List<UnaryOperator<T>>
, tetapi kemudian, kita harus menghadapi kenyataan bahwa tidak adaandThen
implementasi khusus untukUnaryOperator
, jadi kita perlu:Sumber pemanggil berubah menjadi
kemudian.
Sebagai catatan, tidak perlu untuk membangun seperti
sebagai
toString()
metode dariList
menghasilkan output yang persis sama. Karenaprintln(Object)
metode ini memanggiltoString()
secara implisit, Anda bisa menggunakannyasumber
Sepertinya Anda perlu menggunakan
List.replaceAll()
, yang menggantikan setiap elemen dari daftar ini dengan hasil menerapkan operator yang diberikan ke elemen itu.Aku akan mengubah nama metode, meskipun, karena itu generik, sehingga tidak selalu memproses
List
dariString
s.sumber