2011-01-06 92 views
0

我想知道下面的代碼中用於實現類「PredTest」中的接口方法的是什麼類型的概念。需要在類中實現接口方法的說明

static Predicate pred = new Predicate() { 
     public boolean predicate(Object o) { 
     return o.toString().startsWith("Hi"); 
     } 
    }; 

全碼

import java.util.*; 

public class PredTest { 
static Predicate pred = new Predicate() { 
    public boolean predicate(Object o) { 
    return o.toString().startsWith("Hi"); 
    } 
}; 

public static void main(String args[]) { 
    String [] names = {"java", "ProdTest", "One", "Two", "Hi", "Three", "Four", "High", "Six", "Seven", "Higher"}; 
    List<String> list = Arrays.asList(names); 
    Iterator<String> i1 = list.iterator(); 
    Iterator<String> i = new PredicateIterator(i1, pred); 
    while (i.hasNext()) { 
    System.out.println(i.next()); 
    } 
} 
} 

class PredicateIterator implements Iterator<String> { 
Iterator<String> iter; 
Predicate pred; 
String next; 
boolean doneNext = false; 

public PredicateIterator(Iterator<String> iter, Predicate pred) { 
    this.iter = iter; 
    this.pred = pred; 
} 

public void remove() { 
    throw new UnsupportedOperationException(); 
} 

public boolean hasNext() { 
    doneNext = true; 
    boolean hasNext; 
    while (hasNext = iter.hasNext()) { 
    next = iter.next(); 
    if (pred.predicate(next)) { 
    break; 
    } 
    } 
    return hasNext; 
} 

public String next() { 
    if (!doneNext) { 
    boolean has = hasNext(); 
    if (!has) { 
    throw new NoSuchElementException(); 
    } 
    } 
    doneNext = false; 
    return next; 
} 
} 

interface Predicate { 
boolean predicate(Object element); 
} 

回答

3

我相信你正在尋找的期限爲「匿名內部類的一些支持。這些將導致編譯器的$輸出文件(在這種情況下爲PredTest $ 1.class)。

0

我不知道這是否正是回答你的問題,但Google GuavaIterables.filter它做什麼你的自定義迭代器做有:

public class PredTest { 
    private static Predicate<String> startsWithPredicate = new Predicate<String>() { 
    @Override public boolean apply(String input) { 
     return input.startsWith("Hi"); 
    } 
    }; 

    public static void main(String[] args) { 
    List<String> someList = ImmutableList.of("Hello", "Hi Java", "Whatever", "Hi World"); 
    System.out.println(Joiner.on(", ").join(Iterables.filter(someList, startsWithPredicate))); 
    } 
} 

此代碼應打印

嗨的Java,高世

有番石榴,甚至一些預先定義的謂詞實現,例如Predicates.contains(someRegex),參見the Javadoc for class Predicates

0

這被稱爲函子或函數對象,是一種函數式編程風格。你可以認爲它是一個if語句的對象。它使用輸入對象(在您的示例字符串中)返回true或false值,並且經常用於驗證或過濾(在您用於過濾的示例中)。

在Java中,比較器可以被看作謂詞的一個例子。某些庫(如下所示)提供了函子

  1. commons collections
  2. google-guava
  3. functional java