我想知道在下面的代码中使用什么类型的概念来实现“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);
}
答案 0 :(得分:3)
我相信你要找的那个词是'匿名的内心阶级'。这些导致来自编译器的$ output文件(在本例中为PredTest $ 1.class)。
答案 1 :(得分:0)
我不知道这是否完全回答了你的问题,但Google Guava有Iterables.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,Hi World
在Guava中甚至有一些预先定义的Predicate实现,例如Predicates.contains(someRegex)
,请参阅the Javadoc for class Predicates
。
答案 2 :(得分:0)
这被称为Functor或Function Object,是一种函数式编程风格。您可以认为它是一个等同于if语句的对象。它使用输入对象(在您的示例String中)返回true或false值,并且通常用于验证或过滤(在您用于过滤的示例中)。
在Java中,Comparator可以被认为是Predicate的一个例子。某些库(下面列出)为Functors提供了一些支持