2016-08-22 1 views
0

J'essaie de créer une méthode qui place les résultats d'une fonction dans un consommateur en utilisant des références non liées (je pense). Voici le scénario. Avec ResultSet de JDBC, vous pouvez obtenir des valeurs de ligne par index. J'ai une instance de Bean dans laquelle je veux placer les valeurs sélectionnées. Je cherche un moyen d'éviter l'écriture du code de la cartographie de la plaque de la chaudière, mais plutôt obtenir quelque chose comme:Lutte de syntaxe de référence Java 8 non liée

static <T> void copy(Consumer<T> setter, Function<T, Integer> getter, Integer i); 

Et appelez comme:

copy(Bean::setAValue, ResultSet::getString, 0) 

Je ne veux pas la liaison Bean et ResultSet à par exemple trop tôt puisque je veux que ce soit utilisable avec n'importe quel bean de ResultSet.

L'exemple que j'ai essayé de travailler à partir est:

public static <T> void println(Function<T,String> function, T value) { 
    System.out.println(function.apply(value)); 
} 

Appelée via:

println(Object::toString, 0L); 
+2

Et quel est le problème avec 'bean.setAValue (rs.getString (0))'? Comment votre code est-il supérieur à celui-là? Btw, quel est exactement votre problème? – Seelenvirtuose

+0

Vous ne pourrez pas utiliser 'Consumer' ou' Function' - ces méthodes de déclaration d'interface qui n'acceptent qu'un seul argument. Vous avez besoin de quelque chose qui accepte deux arguments (dans le cas de 'Bean :: setValue' - l'un représentant' Bean', l'autre représentant 'T'). –

+0

On ne sait pas où vous avez des difficultés. Vous pouvez rencontrer des problèmes avec 'ResultSet # getString' en lançant une vérification' SQLException'. Je pense que cela viole l'interface 'Function'. – bradimus

Répondre

3

Lorsque vous faites référence statiquement les méthodes d'instance, un paramètre supplémentaire est ajouté du type englobante. Ce paramètre représente l'instance sur laquelle appeler la méthode.

Pour vous cela voudrait dire, avoir à utiliser un BiConsumer et BiFunction:

static <T> void copy(BiConsumer<Bean, T> setter, 
    BiFunction<ResultSet, T, Integer> getter, Integer i);