2011-05-25 5 views
1

est inférieure à la structure de l'objet -prédicats question enchaînant

  • classe A a une collection de classe B
  • classe B a un à mappage univoque avec classe C
  • J'ai un prédicat P défini dans C

Requirement: Retourne une liste de B qui ont au moins un des éléments du prédicat CP renvoient true.

Ma solution actuelle a une boucle for. Je me demandais si cela peut être fait sans utiliser une boucle for.

+0

Mettre en œuvre un comparateur personnalisé? – dhblah

+5

Pouvez-vous donner un exemple de votre solution de boucle 'for' actuelle? Je ne suis pas sûr de te suivre. – ColinD

Répondre

1

Si je comprends bien ... vous ne pouvez pas simplement créer un prédicat pour B qui appelle le prédicat pour C?

dire en B ...

new Predicate<B>() { 
    @Override 
    public boolean apply(B record) { 
    return new PredicateOverC().apply(record.getC()) 
    } 
} 

Et puis en A, vous pouvez simplement utiliser Collections2.filter sur la collection de B et ce nouveau prédicat?

4

Pourquoi est-ce important que le prédicat soit défini? Voulez-vous dire que c'est définir sur C?

// You already have Predicate<C> defined somewhere 
Predicate<C> csPredicate = new Predicate<C>() { 
    public boolean apply(C c) { 
     return someComputationOn(c); 
    } 
}; 

Iterables.filter(A.getIterableOfB(), 
    Predicates.compose(
     csPredicate, 
     new Function<B, C>() { 
      @Override 
      public C apply(B b) { 
       return b.getC(); 
      } 
})); 

Ma réponse est très similaire à sMoZely (+1), sauf que je utilise Iterables.filter() et la composition prédicats au lieu d'utiliser Collections2 mais l'idée est la même. Il se peut également que je manque quelque chose dans la question ...

+0

C'est aussi une bonne solution ... Je ne connaissais pas la fonction composer. – sMoZely

+1

Nécessité de mettre en œuvre 'Prédicat ' – Ray

+1

@Ray - oui vous avez raison - je l'ai laissé comme ça parce que l'OP semblait déjà avoir cela, donc je l'ai laissé comme un espace réservé - j'ai mis à jour la réponse. – alpian