Нужно разъяснение по реализации методов интерфейса внутри класса - PullRequest
0 голосов
/ 06 января 2011

Я хотел бы знать, какой тип концепции используется в приведенном ниже коде для реализации метода интерфейса в классе "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 ]

3 голосов
/ 06 января 2011

Я считаю, что вы ищете термин «анонимный внутренний класс».Это приводит к выходным файлам $ от компилятора (в данном случае PredTest $ 1.class).

0 голосов
/ 06 января 2011

Это называется Functor или Function Object и является своего рода функциональным стилем программирования.Вы можете думать о нем как об объектном эквиваленте оператора if.Он использует входной объект (в вашем примере String) для возврата значения true или false и часто используется при проверке или фильтрации (в вашем примере вы используете для фильтрации).

В Java Comparator может бытьподумал о примере предиката.Некоторые библиотеки (перечислены ниже) предоставляют некоторую поддержку для Functors

  1. коллекций общих ресурсов
  2. google-guava
  3. функциональный Java
0 голосов
/ 06 января 2011

Я не знаю, точно ли это отвечает на ваш вопрос, но 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)));
  }
}

Этот код должен напечатать

Привет, Ява, Привет, Мир

Есть даже некоторые предопределенные реализации Предиката в Гуаве, например Predicates.contains(someRegex), см. Javadoc для class Predicates.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...