SORU
2 HAZİRAN 2010, ÇARŞAMBA


Yüklem Java

Java Yüklem kullandığı kodu ile gidiyorum. Asla yüklem kullandım. Birisi yüklem öğretici ya da kavramsal bir açıklama ve java bunların uygulanması için bana rehberlik eder ? Çok yardımcı... Google yoktu

CEVAP
2 HAZİRAN 2010, ÇARŞAMBA


Guava com.google.common.base.Predicate<T> bahsettiğini varsayıyorum.

API:

Belirler belirli bir giriş için true false bir değer. Örneğin, RegexPredicate Predicate<String>, uygulamak ve verilen düzenli ifade ile eşleşen bir dize için doğru döndürebilir.

Bu aslında boolean bir test için OOP bir soyuttur.

Örneğin, bu gibi bir yardımcı yöntem olabilir:

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

Şimdi, verilen List<Integer>, bu gibi sadece çift sayıları işleyebilir:

    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 test türü olarak soyutlanmış çıktı. Bu Predicate gereken birçok yardımcı program yöntemleri olan Iterables gibi API geri kalanı ile birlikte sağlar.

Bu nedenle, şimdi böyle bir şey yazabilirsiniz:

    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);
    }

Şimdilik her döngü if test olmadan çok daha basit olduğunu unutmayın. filterıng Predicate kullanarak Iterable<Integer> evenNumbers, tanımlayarak abtraction daha yüksek bir seviyeye ulaştık.

API bağlantıları


Üst düzey bir özellik

Predicate Iterables.filter sipariş daha yüksek bir işlev olarak adlandırılan hizmeti sunuyor. Kendi başına, bu pek çok avantajı vardır. Yukarıda List<Integer> numbers örnek alalım. Eğer tüm sayılar pozitif ise test etmek istediğimizi varsayalım. Böyle bir şey yazabiliriz:

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

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

Kitaplıkları geri kalanı ile* *28, ve bir çalışma ile, bu yazabiliriz yerine:

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

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

Umarım şimdi yordamları için daha yüksek soyutlamalar gibi değeri görebilirsiniz "verilen yüklem tarafından tüm öğeleri filtre", "tüm öğeler", vb yapmak daha iyi kod için. yüklem verilen tatmin olmadığını kontrol edin

Ne yazık ki Java birinci sınıf bir yöntem yok: geçemezsinizyöntemlerietrafında Iterables.filter Iterables.all. Tabii ki, etrafında iletebilirsiniznesnelerJava. Böylece, Predicate türü tanımlanmıştır ve geçiyorsunuznesnelerbu arayüzü yerine uygulanması.

Ayrıca Bkz

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Jason Parker

    Jason Parker

    14 Aralık 2009
  • UrAvgConsumer

    UrAvgConsume

    1 Ocak 2012
  • williamfitzsimmons

    williamfitzs

    14 Mart 2008