CodeGym /Blog Java /Ngẫu nhiên /Vị ngữ Java với các ví dụ

Vị ngữ Java với các ví dụ

Xuất bản trong nhóm
Nói chung, vị ngữ có nghĩa là một câu lệnh xác định xem một giá trị có thể đúng hay sai. Trong lập trình, các vị từ có nghĩa là các hàm có một đối số trả về giá trị boolean. Vị ngữ giao diện chức năng đã được hiện thực hóa trong Java 8. “Chức năng” có nghĩa là nó chỉ chứa một phương thức trừu tượng. Nó chấp nhận một đối số và trả về một giá trị boolean. Trong Java, các giao diện chức năng được sử dụng để xử lý các biểu thức Lambda, hàm tạo và tham chiếu Phương thức. Thông thường Vị ngữ Java 8 được sử dụng để áp dụng bộ lọc cho một tập hợp các đối tượng. Chúng ta hãy xem xét các ứng dụng chính của nó và các phương pháp được sử dụng rộng rãi, cũng như giải quyết một số vấn đề thực tế. Vị ngữ Java với các ví dụ - 1

Tại sao nhà phát triển sử dụng Predicate

Về cơ bản, các nhà phát triển có thể sử dụng các vị từ cho bất kỳ tác vụ nào liên quan đến việc đánh giá các mục dựa trên các tiêu chí được xác định trước và trả về một giá trị boolean. Dưới đây là ví dụ về các nhiệm vụ đơn giản mà các nhà phát triển xử lý bằng cách sử dụng các vị từ:
  • Lọc một tập hợp các số nguyên.
  • Sắp xếp danh sách bằng cách đảm bảo rằng dữ liệu tuân thủ một số điều kiện được xác định trước (ví dụ: sắp xếp một loạt mặt hàng bằng cách đặt điều kiện về giá và trọng lượng).
  • Sử dụng các gói tiện ích trong lập trình đồng thời.
Predicates là một tính năng quan trọng trong kiểm thử phần mềm. Giao diện chức năng giúp dễ dàng tách các đơn vị để thử nghiệm, cải thiện khả năng đọc và khả năng quản lý của mã ứng dụng.

Cú pháp vị ngữ trong Java

java.util.function.Predicate đã được giới thiệu trong Java 8 như một cách thay thế để xử lý các lần hiển thị đánh giá trong Lambda. Chế độ xem tiêu chuẩn của giao diện là Predicate<T> , trong đó T là một đối số duy nhất trả về giá trị boolean. Các vị từ Java có một phương thức (đối tượng) chức năng (trừu tượng) test(Object) để đánh giá vị từ này trên một Đối tượng đã cho.

@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
}
Đây là một ví dụ về cách viết một Vị từ đơn giản để lọc các số nguyên dựa trên các điều kiện “lớn hơn”, “nhỏ hơn”.

// An example of a simple Java predicate
  
import java.util.function.Predicate; 
public class PredicateExample { 
    public static void main(String[] args) 
    { 
        // Creating predicate 
        Predicate<Integer> lesserThan = i -> (i < 18);  
  
        // Calling Predicate method 
        System.out.println(lesserThan.test(10));  
    }
}
Đầu ra sẽ là true vì 10 < 18. Một ví dụ nữa với Predicate in filter() . Vị ngữ giúp lọc tất cả người lớn từ danh sách độ tuổi.

  import java.util.List;
  import java.util.function.Predicate;

  public class PredicateExample {
      public static void main(String[] args) {
          List<Integer> ages = List.of(17, 18, 19, 28, 18, 28, 46, 7, 8, 9, 21, 12);
          NotLessThan18<Integer> isAdult = new NotLessThan18<>();
          ages.stream().filter(isAdult).forEach(System.out::println);
      }
  }



class NotLessThan18<E> implements Predicate<Integer> {

      @Override
      public boolean test(Integer v) {
          Integer ADULT = 18;
          return v >= ADULT;
      }
  }
Đầu ra là:
18 19 28 18 28 46 21

Các phương thức vị ngữ Java 8

Predicate Interface có một số phương thức.
  • boolean test(T t) đánh giá vị từ đối số đã cho.
  • default Predicate<T> and(Predicate<? super T> other) trả về một vị từ đại diện cho logic AND ngắn mạch của vị từ này và vị từ khác.
  • default Predicate<T> hoặc trả về một predicate được tổng hợp đại diện cho logic ngắn mạch OR của predicate này và một predicate khác.
  • default Predicate<T> negate() trả về một vị từ trái ngược với vị từ này một cách hợp lý.
  • default Predicate<T> isEqual(Object targetRef) trả về kết quả kiểm tra nếu hai đối số bằng nhau theo Objects.equals(Object, Object) .

kiểm tra boolean(T t)

Đây là một phương thức chức năng dành cho các vị từ Java để đánh giá xem một đối số đã cho có thỏa mãn điều kiện của một vị từ hay không. Ví dụ: ở đây ta tạo vị từ người lớn cho tất cả những người từ 18 tuổi trở lên. phương thức test() lấy một giá trị số nguyên và kiểm tra nó.

import java.util.function.Predicate;
public class PredicateTestTest {
   public static void main(String[] args) {
       Predicate<Integer> adult = i -> i >= 18;
       System.out.println(adult.test(12));
       System.out.println(adult.test(19));
       System.out.println(adult.test(21));
   }
}
Đầu ra cho đoạn mã trên sẽ là gì? Trong trường hợp đầu tiên, vì 12 nhỏ hơn 18, nên nó sẽ sai. Đối với kịch bản thứ hai và thứ ba, các điều kiện được đáp ứng nên kết quả trả về sẽ là true.
sai đúng đúng

Vị ngữ mặc định.and()

Phương thức này đại diện cho toán tử “và”. Đó là lý do tại sao, nếu một trong các vị từ đã cho không tuân theo một điều kiện đã đặt, thì một vị từ khác sẽ không nhận được đánh giá. Ví dụ: Hãy soạn các vị từ trong Java, lọc tất cả những người đã là người lớn nhưng dưới 65 tuổi bằng cách sử dụng and() . Hãy sử dụng predicate.add() và viết một vị từ java với lambda cho các điều kiện sau: Nếu điều kiện là đúng, ứng dụng sẽ trả về câu lệnh sau:

import java.util.function.Predicate;

   public class PredicateDemo {
       public static void main(String[] args) {
           Predicate<Integer> adultYet = i -> i >= 18;
           Predicate<Integer> adultStill = i -> i < 65;
           System.out.println(adultYet.and(adultStill).test(5));
           System.out.println(adultYet.and(adultStill).test(38));
           System.out.println(adultYet.and(adultStill).test(90));
       }
   }
Đầu ra là:
sai đúng sai

Predicate.or() mặc định

Phương thức predicate.or() đại diện cho toán tử “OR”. Điều này có nghĩa là điều kiện sẽ vẫn đúng ngay cả khi một trong hai vị từ là đúng và vị từ còn lại là sai. Ví dụ: bây giờ hãy đánh giá các chuỗi ký tự. Hãy thử sử dụng phương thức OR để sắp xếp tất cả các cụm từ có chứa chuỗi con “của tôi” hoặc “bút chì màu”.

import java.util.function.Predicate;

  public class PredicateDemo2 {
      public static void main(String[] args) {
          Predicate<String> containsA = t -> t.contains("crayon");
          Predicate<String> containsB = t -> t.contains("my");
          System.out.println(containsA.or(containsB).test("here is my crayon"));
          System.out.println(containsA.or(containsB).test("here is my pencil"));
          System.out.println(containsA.or(containsB).test("here is John's crayon"));
          System.out.println(containsA.or(containsB).test("here is John's pencil"));
      }
  }
Đầu ra là:
đúng đúng đúng sai

phủ định Predicate()

negate() được sử dụng để thu thập tất cả các giá trị không tuân thủ các tiêu chí được xác định trước. Ví dụ: nếu bạn muốn sắp xếp trong lớp “Cà chua” và tìm tất cả các mục không phải là “Đỏ”, bạn có thể viết Vị ngữ và nhanh chóng quét qua toàn bộ chuỗi. Hãy thử tự viết mã cho mã này và kiểm tra mã đó với giải pháp sau khi bạn hoàn thành.

import java.util.function.Predicate;

public class PredicateDemo3 {
public static void main(String[] args) {
 Predicate<Integer> adult = i -> i >= 18;
System.out.println(adult.negate().test(7));  System.out.println(adult.negate().test(19))
  }
   }
Đầu ra là:
đúng sai

Vị ngữ tĩnh isEqual (Đối tượng targetRef)

Phương pháp này rất hữu ích nếu bạn muốn xác định xem hai đối tượng có bằng một giá trị được xác định là tham số của Objects.equals() hay không. Phương pháp này đặc biệt hữu ích nếu bạn cần so sánh các kết quả thử nghiệm tương tự. Ví dụ: giả sử bạn đang so sánh hai xe chở lê và muốn chắc chắn rằng cả hai đều có quả có trọng lượng và màu sắc tiêu chuẩn. Trong trường hợp này, Predicate tĩnh isEqual(Object targetRef) chính xác là phương thức bạn cần. Chúng ta hãy xem cách isEqual kiểm tra sự bằng nhau của hai chuỗi:

import java.util.function.Predicate;

public class PredicateDemo2 {
   public static void main(String[] args) {
       Predicate<String> i = Predicate.isEqual("here is my crayon");
       System.out.println(i.test("here is my pencil"));
       System.out.println(i.test("here is my crayon"));
   }
}
Nếu một đối tượng bạn đang phân tích tuân thủ các điều kiện tiêu chuẩn, hàm sẽ trả về true. Đầu ra là:
sai đúng

Java IntPredicate

Java IntPredicate là một giao diện chức năng, vì vậy bạn có thể sử dụng nó làm mục tiêu gán cho tham chiếu phương thức hoặc biểu thức lambda. IntPredicate hoạt động trên một số nguyên và trả về một giá trị vị ngữ dựa trên một điều kiện. Chẳng hạn như Predicate Interface, IntPredicate cũng có các phương thức test() , and() , negate() , or() . Đây là một ví dụ về IntPredicate. Nó cũng lọc tất cả người lớn (18 tuổi trở lên) khỏi mảng.

import java.util.Arrays;
import java.util.function.IntPredicate;

public class IntPredicateExample {

   public static void main(String[] args) {

       int[] ages = { 18, 28, 18, 46, 90, 45, 2, 3, 1, 5, 7, 21, 12 };

       IntPredicate p = n -> n >= 18;

       Arrays.stream(ages).filter(p).forEach(System.out::println);
   }
}
Đầu ra là:
18 28 18 46 90 45 21

Viết các vị từ sạch trong Java

Vị từ Java có tính ứng dụng cao và thú vị khi làm việc. Tuy nhiên, trừ khi bạn lưu ý đến cách các biểu thức lambda bạn viết tác động đến mã, nếu không sẽ có nguy cơ làm giảm khả năng bảo trì mã với các biến vị ngữ lộn xộn. Dưới đây là một vài thực hành đơn giản sẽ giúp bạn đảm bảo các giao diện chức năng của bạn dễ quản lý và dễ đọc.
  • Không lặp lại chính mình — không soạn các vị từ bằng Java với các giá trị, phương thức và điều kiện lặp lại nhiều lần. Bằng cách này, bạn sẽ lãng phí thời gian làm việc hiệu quả của mình và làm cho mã trở nên lộn xộn.
  • Tách các biến vị ngữ khỏi mã ứng dụng để đảm bảo khả năng kiểm tra. Ngoài ra, hãy tạo một lịch trình thử nghiệm đơn vị vị ngữ và tuân theo nó.
  • Sử dụng các mẫu nhập và thành phần để đảm bảo các lớp của bạn không bị cồng kềnh và dễ quản lý.
  • Cân nhắc chuyển các vị từ Java sang các lớp Trình trợ giúp — bằng cách này, bạn cải thiện khả năng sử dụng lại mã của mình và tạo điều kiện bảo trì.
  • Khả năng đọc — bất cứ khi nào có thể, hãy ưu tiên các câu lệnh một dòng hơn các vị từ phức tạp. Bạn có thể muốn thể hiện sự hiểu biết của mình về các giao diện chức năng phức tạp. Tuy nhiên, khi nói đến bảo trì, ít hơn là nhiều hơn.
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION