Saya mencoba memfilter sumber daya dan mengecualikan beberapa elemen berdasarkan bidang. Untuk mengecualikan saya memiliki satu set (yang berisi id yang perlu dikecualikan) dan daftar (itu berisi beberapa rentang id yang perlu dikecualikan). Saya menulis logika di bawah ini dan saya tidak puas dengan logika filter ke-2. Apakah ada cara yang lebih baik untuk melakukannya dengan Java 8? Saya perlu melakukan hal yang sama untuk memasukkan rentang juga.
Set<String> extensionsToExclude = new HashSet<>(Arrays.asList("20","25","60","900"));
List<String> rangesToExclude = new ArrayList<>(Arrays.asList("1-10","20-25","50-70","1000-1000000"));
return directoryRecords.stream()
.filter((directoryRecord) -> !extensionsToExclude.contains(directoryRecord.getExtensionNumber()))
.filter((directoryRecord -> {
Boolean include = true;
for(String s : rangesToExclude) {
String [] rangeArray = s.split("-");
Integer extension = Integer.parseInt(directoryRecord.getExtensionNumber());
if(extension <= Integer.parseInt(rangeArray[0]) && extension >= Integer.parseInt(rangeArray[1])) {
include = false;
}
}
return include;
}))
.collect(Collectors.toList());
Terima kasih :)
java
lambda
java-8
java-stream
Yadvendra Rathore
sumber
sumber
Boolean
objek saat Anda hanya perluboolean
nilai. Meskipun di sini, variabelnyainclude
sepenuhnya usang. Ketika satu-satunya perubahan yang mungkin adalah daritrue
kefalse
, Anda dapat menggantinyainclude = false;
denganreturn false;
karena hasil akhirnya telah ditentukan. Kemudian,return include;
pada akhirnya dapat diganti denganreturn true;
dan deklarasi variabel dihapus. Dan karenadirectoryRecord
tidak pernah berubah dalam loop, Anda dapat memindahkanInteger extension = Integer.parseInt(directoryRecord.getExtensionNumber());
sebelum loop (dan mengubahInteger
keint
).Jawaban:
Saya akan melakukannya dengan
Range
kelas khusus , seperti:Yang akan memungkinkan hal seperti ini:
Saya pribadi menemukan filter pertama Anda cukup baik untuk dilestarikan apa adanya.
sumber
noneMatch
ketika kita berbicara tentangrangesToExclude
? Dan saya kira, mungkin ada solusi yang lebih elegan denganTreeSet<Range>
...Saya akan menyarankan mirip dengan jawaban ernest_k dengan
Range
.Namun dalam pendekatan ini Anda dapat menggunakan kedua koleksi untuk membuat
List<Range>
(ini"20"
dapat diperlakukan sebagai"20-20"
) dan mengubah kondisi filter untuk menggunakan negasianyMatch
.MEMPERBARUI
Pembuatan
List<Range> ranges
dapat diubah untuk menghapus titik dariSet<String> extensionsToExclude
yang ada dalam rentang yang dibuatList<String> rangesToExclud
. Maka rentang yang tidak perlu tidak akan dibuat.sumber
Anda dapat melakukan jeda lebih awal jika kondisi rentang benar, daripada menunggu semua entri dievaluasi.
jika tidak, kembalikan saja false setelah for loop.
sumber