2011-01-06 71 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
相关问题