programing

Java의 술어

sourcejob 2022. 9. 20. 23:55
반응형

Java의 술어

다음 코드를 사용하고 있습니다.Predicate자바어.사용한 적이 없다Predicate에 대한 튜토리얼이나 개념적인 설명을 들을 수 있는 사람이 있습니까?Predicate자바에서의 구현에 대해 알려주세요.

과바에서 온 얘기겠죠?

API에서:

를 결정합니다.true또는false값을 지정합니다.예를 들어,RegexPredicate실장 가능Predicate<String>지정된 정규 표현과 일치하는 문자열에 대해 true를 반환합니다.

이는 기본적으로 다음 명령어를 위한 OOP 추상화입니다.boolean시험.

예를 들어 다음과 같은 도우미 방법이 있습니다.

static boolean isEven(int num) {
   return (num % 2) == 0; // simple
}

자, 이제,List<Integer>, 다음과 같은 짝수만 처리할 수 있습니다.

    List<Integer> numbers = Arrays.asList(1,2,3,4,5,6,7,8,9,10);
    for (int number : numbers) {
        if (isEven(number)) {
            process(number);
        }
    }

와 함께Predicate,그if테스트는 유형으로 추상화됩니다.이를 통해 다음과 같은 API의 나머지 부분과 상호 운용할 수 있습니다.예를 들어, API의 많은 유틸리티 메서드는Predicate.

따라서 다음과 같이 쓸 수 있습니다.

    Predicate<Integer> isEven = new Predicate<Integer>() {
        @Override public boolean apply(Integer number) {
            return (number % 2) == 0;
        }               
    };
    Iterable<Integer> evenNumbers = Iterables.filter(numbers, isEven);

    for (int number : evenNumbers) {
        process(number);
    }

이제 각 루프가 훨씬 단순해진 것에 주의해당 루프는if우리는 더 높은 수준의 유추에 도달했습니다Iterable<Integer> evenNumbers,타고filter- ingPredicate.

API 링크


고차 함수일 경우

Predicate허용한다Iterables.filter이른바 고차 함수 역할을 합니다.그 자체로도 많은 이점이 있습니다.를 사용하다List<Integer> numbers를 참조해 주세요.모든 숫자가 양수인지 검정하려고 합니다.다음과 같이 쓸 수 있습니다.

static boolean isAllPositive(Iterable<Integer> numbers) {
    for (Integer number : numbers) {
        if (number < 0) {
            return false;
        }
    }
    return true;
}

//...
if (isAllPositive(numbers)) {
    System.out.println("Yep!");
}

를 사용하여Predicate기타 라이브러리와 상호 운용하여 대신 다음과 같이 기술할 수 있습니다.

Predicate<Integer> isPositive = new Predicate<Integer>() {
    @Override public boolean apply(Integer number) {
        return number > 0;
    }       
};

//...
if (Iterables.all(numbers, isPositive)) {
    System.out.println("Yep!");
}

이제 "모든 요소를 주어진 술어로 필터링", "모든 요소가 주어진 술어를 만족하는지 검사" 등과 같은 루틴에 대한 상위 추상화 값을 볼 수 있으면 더 나은 코드를 만들 수 있습니다.

유감스럽게도 Java에는 퍼스트 클래스 메서드가 없습니다.메서드를 다음에 전달할 수 없습니다.Iterables.filter그리고.Iterables.all물론 자바에서는 오브젝트를 전달할 수 있습니다.즉,Predicatetype이 정의되어 있으며 대신 이 인터페이스를 구현하는 객체를 전달합니다.

「 」를 참조해 주세요.

술어는 참/거짓(부울) 값인 명제가 아닌 참/거짓(부울) 값을 반환하는 함수입니다.Java에서는 독립형 함수를 사용할 수 없기 때문에 술어를 나타내는 오브젝트의 인터페이스를 만들고 그 인터페이스를 구현하는 클래스를 제공하는 것으로 술어를 작성합니다.술어의 인터페이스의 예를 다음에 나타냅니다.

public interface Predicate<ARGTYPE>
{
    public boolean evaluate(ARGTYPE arg);
}

또, 다음과 같은 실장을 실시할 수도 있습니다.

public class Tautology<E> implements Predicate<E>
{
     public boolean evaluate(E arg){
         return true;
     }
}

개념을 더 잘 이해하려면 1차 논리에 대해 읽어보는 것이 좋습니다.

★★★★★
표준 Predicate 인터페이스(java.util.function)가 있습니다.술어)는 Java 8에서 Java API에 정의되어 있습니다.Java 8 이전 버전에서는 com.google.common.base를 재사용하는 것이 편리할 수 있습니다.Guava로부터의 술어 인터페이스.

또한 Java 8부터는 lamda를 사용하여 술어를 작성하는 것이 훨씬 간단하다는 점에 유의하십시오.들어 8을 통과할 수 .p -> true위와 같이 명명된 Tautology 서브클래스를 정의하는 대신 함수로 이동합니다.

Java 문서의 예 또는 Predicate의 사용 예제를 여기에서 볼 수 있습니다.

기본적으로 결과 세트의 행을 특정 기준에 따라 필터링하고 기준을 충족하는 행에 대해 true를 반환하는 데 사용됩니다.

 // the age column to be between 7 and 10
    AgeFilter filter = new AgeFilter(7, 10, 3);

    // set the filter.
    resultset.beforeFirst();
    resultset.setFilter(filter);

마이클이 말한 것을 더하면:

Java 필터링 컬렉션에서는 다음과 같이 Predicate를 사용할 수 있습니다.

public static <T> Collection<T> filter(final Collection<T> target,
   final Predicate<T> predicate) {
  final Collection<T> result = new ArrayList<T>();
  for (final T element : target) {
   if (predicate.apply(element)) {
    result.add(element);
   }
  }
  return result;
}

가능한 술어는 다음과 같습니다.

final Predicate<DisplayFieldDto> filterCriteria = 
                    new Predicate<DisplayFieldDto>() {
   public boolean apply(final DisplayFieldDto displayFieldDto) {
    return displayFieldDto.isDisplay();
   }
  };

사용방법:

 final List<DisplayFieldDto> filteredList=
 (List<DisplayFieldDto>)filter(displayFieldsList, filterCriteria);

언급URL : https://stackoverflow.com/questions/2955043/predicate-in-java

반응형