需要澄清在类中实现接口方法

时间:2011-01-06 06:17:43

标签: java interface

我想知道在下面的代码中使用什么类型的概念来实现“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 个答案:

答案 0 :(得分:3)

我相信你要找的那个词是'匿名的内心阶级'。这些导致来自编译器的$ output文件(在本例中为PredTest $ 1.class)。

答案 1 :(得分: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,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提供了一些支持

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