web-dev-qa-db-fra.com

Renvoie Lambda de la méthode dans Java 8?

Je viens de commencer à utiliser Java 8 et je me demande s'il existe un moyen d'écrire une méthode qui renvoie un Function?

En ce moment, j'ai une méthode comme ci-dessous:

Function<Integer, String> getMyFunction() {
  return new Function<Integer, String>() {
    @Override public String apply(Integer integer) {
      return "Hello, world!"
    }
  } 
}

Existe-t-il un moyen d'écrire cela plus succinctement en Java 8? J'espérais que cela fonctionnerait mais cela ne fonctionne pas:

Function<Integer, String> getMyFunction() {
  return (it) -> { return "Hello, world: " + it } 
}
26
Philip Lombardi

Débarrassez-vous de votre déclaration de retour à l'intérieur de votre définition de fonction:

Function<Integer, String> getMyFunction() {
    return (it) -> "Hello, world: " + it;
}
32
mkobit

Il vous manque des points-virgules:

return (it) -> { return "Hello, world: " + it; };

Bien que comme indiqué, il peut être abrégé comme suit:

return it -> "Hello, world: " + it;
16
assylias

Je voudrais souligner qu'il pourrait être plus approprié d'utiliser le IntFunction intégré dans ce cas:

IntFunction<String> getMyFunction() {
    return it -> "Hello, world: " + it;
}

IntFunction fait partie de la API standard pour les interfaces fonctionnelles qui définit une gamme de bonnes d'avoir des interfaces, principalement liées à Java primitives.

5
Magnilex

Vous pouvez l'écrire simplement comme ça:

Function<Integer, String> function = n -> "Hello, world " + n;
3
Oussama Zoghlami

Ainsi, la réponse pour 99% des cas a été donnée par @assylias

Il vous manque des points-virgules:

return (it) -> { return "Hello, world: " + it; }; Although as noted it peut être raccourci en:

return it -> "Hello, world: " + it;

Pourtant, je pense que cela vaut la peine d'ajouter cela, si vous voulez affecter votre lambda à une variable (à utiliser plus tard). Vous pouvez le faire en tapant:

Callable<YourClass> findIt = () -> returnInstanceOfYourClass();

Et puis vous pouvez facilement l'utiliser, un exemple d'une telle utilisation:

if(dontNeedzToWrap()) {
                return findIt.call();
  }
return Wrapp.withTransaction(() -> findIt.call());

Étant donné, les choses peuvent être encore plus simples si la méthode Wrapp.withTransaction() accepte le même type de Callable comme paramètres. (J'utilise ceci pour JPA atm)

2
João Antunes