Je suis récemment tombé sur la syntaxe Class::method
qui vous permet d'insérer du code lambda qui à partir d'une méthode statique comme ceci:Possible d'éviter la boxe et le déballage pour Lambda en utilisant la syntaxe de la classe Class ::? (Java)
public class Main {
public static void foo(int foo) {
System.out.println(foo);
}
public static void bar(Consumer<Integer> bar) {
bar.accept(1);
}
public static void main(String[] args) {
bar(Main::foo);
}
}
La question est, est-ce la boxe et unboxing de 1 se produisent encore? Après tout, le paramètre bar
est un Consumer<Integer>
qui devrait normalement contenir des primitives, alors que foo(int)
est une méthode qui accepte une primitive, donc la boxe n'est pas nécessaire.
Alors, que se passe-t-il? Est-ce que 1
est transformé en Integer
ou reste-t-il primitif? Sur une note de côté, je sais que IntConsumer
offre une solution pour se débarrasser de la boxe et du déballage, mais pas toutes les interfaces fonctionnelles ont une alternative pour chaque type primitif, d'où la question.
Si vous êtes dans une situation où vous êtes libre de choisir entre Consumer et IntConsumer, il est probable que vous soyez également libre de créer vos propres interfaces fonctionnelles utilisant des types primitifs. –