Ada cara untuk membuat referensi metode yang merupakan kebalikan dari referensi metode saat ini. Lihat jawaban @ vlasec di bawah ini yang menunjukkan bagaimana dengan secara eksplisit melemparkan referensi metode ke a Predicate
dan kemudian mengubahnya menggunakan negate
fungsi. Itu adalah salah satu cara di antara beberapa cara lain yang tidak terlalu merepotkan untuk melakukannya.
Kebalikan dari ini:
Stream<String> s = ...;
int emptyStrings = s.filter(String::isEmpty).count();
Apakah ini:
Stream<String> s = ...;
int notEmptyStrings = s.filter(((Predicate<String>) String::isEmpty).negate()).count()
atau ini:
Stream<String> s = ...;
int notEmptyStrings = s.filter( it -> !it.isEmpty() ).count();
Secara pribadi, saya lebih suka teknik nanti karena saya merasa lebih jelas untuk membaca it -> !it.isEmpty()
daripada pemeran verbal panjang dan kemudian meniadakan.
Anda juga bisa membuat predikat dan menggunakannya kembali:
Predicate<String> notEmpty = (String it) -> !it.isEmpty();
Stream<String> s = ...;
int notEmptyStrings = s.filter(notEmpty).count();
Atau, jika memiliki koleksi atau array, cukup gunakan for-loop yang sederhana, memiliki lebih sedikit overhead, dan * mungkin ** lebih cepat:
int notEmpty = 0;
for(String s : list) if(!s.isEmpty()) notEmpty++;
* Jika Anda ingin tahu apa yang lebih cepat, maka gunakan JMH http://openjdk.java.net/projects/code-tools/jmh , dan hindari kode benchmark tangan kecuali menghindari semua optimasi JVM - lihat Java 8: kinerja Streams vs Koleksi
** Saya mendapatkan kritik karena menyarankan bahwa teknik for-loop lebih cepat. Ini menghilangkan pembuatan aliran, menghilangkan menggunakan pemanggilan metode lain (fungsi negatif untuk predikat), dan menghilangkan daftar / penghitung akumulator sementara. Jadi beberapa hal yang disimpan oleh konstruk terakhir yang mungkin membuatnya lebih cepat.
Saya pikir itu lebih sederhana dan lebih baik, meskipun tidak lebih cepat. Jika pekerjaan itu membutuhkan palu dan paku, jangan bawa gergaji dan lem! Saya tahu beberapa dari Anda mempermasalahkan hal itu.
wish-list: Saya ingin melihat Stream
fungsi Java berkembang sedikit sekarang karena pengguna Java lebih mengenalnya. Misalnya, metode 'hitung' di Stream dapat menerima Predicate
sehingga ini dapat dilakukan secara langsung seperti ini:
Stream<String> s = ...;
int notEmptyStrings = s.count(it -> !it.isEmpty());
or
List<String> list = ...;
int notEmptyStrings = lists.count(it -> !it.isEmpty());
Predicate.not(Predicate)
metode statis . Tapi masalah itu masih terbuka sehingga kita akan melihat ini paling awal di Java 12 (jika pernah).