2011-01-06 1 views
0

Ich möchte wissen, welche Art von Konzept in der folgenden Code für die Implementierung von Interface-Methode in der Klasse "PredTest" verwendet wird.Benötigen Sie eine Erläuterung zum Implementieren von Interface-Methoden innerhalb einer Klasse

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

vollständigen Code

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); 
} 

Antwort

3

Ich glaube, der Begriff Sie suchen, "anonyme innere Klasse ist. Diese ergeben die $ Ausgabedateien vom Compiler (in diesem Fall PredTest $ 1.class).

0

Ich weiß nicht, ob dies Ihre Frage genau beantwortet, aber Google GuavaIterables.filter hat, die tut, was Ihre benutzerdefinierten Iterator es tut:

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))); 
    } 
} 

Dieser Code sollte

drucken

Hallo Java, Hallo Welt

Es gibt sogar einige vordefinierte Prädikats Implementierungen in Guava, z.B. Predicates.contains(someRegex), siehe the Javadoc for class Predicates.

0

Dies ist bekannt als ein Functor oder Function Object und ist eine Art von funktionalen Programmierstil. Sie können sich vorstellen, dass es sich um ein Objektäquivalent einer if-Anweisung handelt. Es verwendet das Eingabeobjekt (in Ihrem Beispiel String), um einen Wahr- oder Falsch-Wert zurückzugeben, und wird häufig bei der Validierung oder Filterung verwendet (in Ihrem Beispiel wird zum Filtern verwendet).

In Java kann Comparator ein Beispiel für ein Prädikat sein. Bestimmte Bibliotheken (siehe unten) bietet eine gewisse Unterstützung für Funktoren

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