Saya akan melalui kode yang digunakan Predicatedi Java. Saya tidak pernah menggunakan Predicate. Dapatkah seseorang memandu saya untuk tutorial atau penjelasan konseptual apa pun Predicatedan implementasinya di Java?
Menentukan nilai trueatau falseuntuk masukan yang diberikan. Misalnya, a RegexPredicatemight implement Predicate<String>, dan return true untuk string apa pun yang cocok dengan ekspresi reguler yang diberikan.
Ini pada dasarnya adalah abstraksi OOP untuk booleantes.
Misalnya, Anda mungkin memiliki metode pembantu seperti ini:
Sekarang, diberi a List<Integer>, Anda hanya dapat memproses bilangan genap seperti ini:
List<Integer> numbers =Arrays.asList(1,2,3,4,5,6,7,8,9,10);for(int number : numbers){if(isEven(number)){
process(number);}}
Dengan Predicate, iftes disarikan sebagai tipe. Hal ini memungkinkannya untuk beroperasi dengan API lainnya, seperti Iterables, yang memiliki banyak metode utilitas yang dibutuhkan Predicate.
Jadi, Anda sekarang dapat menulis sesuatu seperti ini:
Perhatikan bahwa sekarang pengulangan untuk setiap jauh lebih sederhana tanpa ifpengujian. Kita telah mencapai tingkat abstraksi yang lebih tinggi dengan mendefinisikan Iterable<Integer> evenNumbers, dengan filtermenggunakan a Predicate.
Predicatememungkinkan Iterables.filteruntuk berfungsi sebagai apa yang disebut fungsi tingkat tinggi. Dengan sendirinya, ini menawarkan banyak keuntungan. Ambil List<Integer> numberscontoh di atas. Misalkan kita ingin menguji apakah semua bilangan positif. Kita bisa menulis sesuatu seperti ini:
staticboolean isAllPositive(Iterable<Integer> numbers){for(Integer number : numbers){if(number <0){returnfalse;}}returntrue;}//...if(isAllPositive(numbers)){System.out.println("Yep!");}
Dengan a Predicate, dan beroperasi dengan pustaka lainnya, sebagai gantinya kita dapat menulis ini:
Predicate<Integer> isPositive =newPredicate<Integer>(){@Overridepublicboolean apply(Integer number){return number >0;}};//...if(Iterables.all(numbers, isPositive)){System.out.println("Yep!");}
Mudah-mudahan sekarang Anda dapat melihat nilai dalam abstraksi yang lebih tinggi untuk rutinitas seperti "filter semua elemen dengan predikat yang diberikan", "periksa apakah semua elemen memenuhi predikat yang diberikan", dll. Buat kode yang lebih baik.
Sayangnya Java tidak memiliki metode kelas satu: Anda tidak dapat meneruskan metode ke Iterables.filterdan Iterables.all. Anda tentu saja bisa menyebarkan objek di Java. Jadi, Predicatejenisnya ditentukan, dan Anda lulus objek yang mengimplementasikan antarmuka ini sebagai gantinya.
Saya tidak mengacu pada Predikat Jambu, saya seharusnya menjelaskan pertanyaan saya. Tapi penjelasan Anda membantu saya memahami apa yang saya cari, cara logika predikat digunakan di java. Terima kasih atas penjelasan yang rumit
srikanth
@polygenelubricants, Mengapa menemukan Predicate<Integer>ketika kita sudah memiliki F<Integer, Boolean>yang melakukan hal yang sama persis?
Pacerier
Anda juga bisa melakukannya dengan cara java 8: List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); Predicate<Integer> isEven = integer -> (integer % 2) == 0; Iterable<Integer> evenNumbers = numbers.stream().filter(isEven).collect(Collectors.toList());
14
Predikat adalah fungsi yang mengembalikan nilai benar / salah (yaitu boolean), berlawanan dengan proposisi yang merupakan nilai benar / salah (yaitu boolean). Di Java, seseorang tidak dapat memiliki fungsi mandiri, sehingga seseorang membuat predikat dengan membuat antarmuka untuk objek yang mewakili predikat dan kemudian menyediakan kelas yang mengimplementasikan antarmuka tersebut. Contoh antarmuka untuk predikat mungkin adalah:
Juga, perhatikan bahwa pada Java 8, jauh lebih sederhana untuk menulis predikat dengan menggunakan lambda. Misalnya, di Java 8 dan yang lebih tinggi, seseorang dapat meneruskan p -> trueke fungsi alih-alih menentukan subkelas Tautologi bernama seperti di atas.
Anda dapat melihat contoh java doc atau contoh penggunaan Predicate disini
Pada dasarnya ini digunakan untuk memfilter baris dalam kumpulan hasil berdasarkan kriteria tertentu yang mungkin Anda miliki dan mengembalikan nilai true untuk baris yang memenuhi kriteria Anda:
// the age column to be between 7 and 10AgeFilter filter =newAgeFilter(7,10,3);// set the filter.
resultset.beforeFirst();
resultset.setFilter(filter);
Anda dapat menggunakan Predikat sebagai berikut dalam memfilter koleksi di java:
publicstatic<T>Collection<T> filter(finalCollection<T> target,finalPredicate<T> predicate){finalCollection<T> result =newArrayList<T>();for(final T element : target){if(predicate.apply(element)){
result.add(element);}}return result;}
Bukankah hal itu pada dasarnya menggagalkan tujuannya? Alasan utama dalam memilih pendekatan fungsional adalah untuk TIDAK mengulang secara manual dan menghilangkan for. Tingkat abstraksi menjadi lebih tinggi dan lebih kuat - namun melakukan untuk secara manual mengalahkan tujuan itu dan kembali ke abstraksi tingkat rendah.
Predicate
? Sesuatu yang mirip? Sesuatu yang sama sekali lain?Predicate
Jawaban:
Saya berasumsi yang Anda bicarakan
com.google.common.base.Predicate<T>
dari Jambu biji.Dari API:
Ini pada dasarnya adalah abstraksi OOP untuk
boolean
tes.Misalnya, Anda mungkin memiliki metode pembantu seperti ini:
Sekarang, diberi a
List<Integer>
, Anda hanya dapat memproses bilangan genap seperti ini:Dengan
Predicate
,if
tes disarikan sebagai tipe. Hal ini memungkinkannya untuk beroperasi dengan API lainnya, sepertiIterables
, yang memiliki banyak metode utilitas yang dibutuhkanPredicate
.Jadi, Anda sekarang dapat menulis sesuatu seperti ini:
Perhatikan bahwa sekarang pengulangan untuk setiap jauh lebih sederhana tanpa
if
pengujian. Kita telah mencapai tingkat abstraksi yang lebih tinggi dengan mendefinisikanIterable<Integer> evenNumbers
, denganfilter
menggunakan aPredicate
.Tautan API
Iterables.filter
Pada fungsi tingkat tinggi
Predicate
memungkinkanIterables.filter
untuk berfungsi sebagai apa yang disebut fungsi tingkat tinggi. Dengan sendirinya, ini menawarkan banyak keuntungan. AmbilList<Integer> numbers
contoh di atas. Misalkan kita ingin menguji apakah semua bilangan positif. Kita bisa menulis sesuatu seperti ini:Dengan a
Predicate
, dan beroperasi dengan pustaka lainnya, sebagai gantinya kita dapat menulis ini:Mudah-mudahan sekarang Anda dapat melihat nilai dalam abstraksi yang lebih tinggi untuk rutinitas seperti "filter semua elemen dengan predikat yang diberikan", "periksa apakah semua elemen memenuhi predikat yang diberikan", dll. Buat kode yang lebih baik.
Sayangnya Java tidak memiliki metode kelas satu: Anda tidak dapat meneruskan metode ke
Iterables.filter
danIterables.all
. Anda tentu saja bisa menyebarkan objek di Java. Jadi,Predicate
jenisnya ditentukan, dan Anda lulus objek yang mengimplementasikan antarmuka ini sebagai gantinya.Lihat juga
sumber
Predicate<Integer>
ketika kita sudah memilikiF<Integer, Boolean>
yang melakukan hal yang sama persis?List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10); Predicate<Integer> isEven = integer -> (integer % 2) == 0; Iterable<Integer> evenNumbers = numbers.stream().filter(isEven).collect(Collectors.toList());
Predikat adalah fungsi yang mengembalikan nilai benar / salah (yaitu boolean), berlawanan dengan proposisi yang merupakan nilai benar / salah (yaitu boolean). Di Java, seseorang tidak dapat memiliki fungsi mandiri, sehingga seseorang membuat predikat dengan membuat antarmuka untuk objek yang mewakili predikat dan kemudian menyediakan kelas yang mengimplementasikan antarmuka tersebut. Contoh antarmuka untuk predikat mungkin adalah:
Dan kemudian Anda mungkin memiliki implementasi seperti:
Untuk mendapatkan pemahaman konseptual yang lebih baik, Anda mungkin ingin membaca tentang logika orde pertama.
Sunting
Ada antarmuka Predikat standar ( java.util.function.Predicate ) yang didefinisikan dalam Java API pada Java 8. Sebelum Java 8, Anda mungkin merasa nyaman untuk menggunakan kembali antarmuka com.google.common.base.Predicate dari Jambu biji .
Juga, perhatikan bahwa pada Java 8, jauh lebih sederhana untuk menulis predikat dengan menggunakan lambda. Misalnya, di Java 8 dan yang lebih tinggi, seseorang dapat meneruskan
p -> true
ke fungsi alih-alih menentukan subkelas Tautologi bernama seperti di atas.sumber
Anda dapat melihat contoh java doc atau contoh penggunaan Predicate disini
Pada dasarnya ini digunakan untuk memfilter baris dalam kumpulan hasil berdasarkan kriteria tertentu yang mungkin Anda miliki dan mengembalikan nilai true untuk baris yang memenuhi kriteria Anda:
sumber
Menambah apa yang Micheal :
Anda dapat menggunakan Predikat sebagai berikut dalam memfilter koleksi di java:
satu kemungkinan predikat adalah:
Pemakaian:
sumber