web-dev-qa-db-fra.com

Comment puis-je obtenir un IntStream à partir d'une liste <Integer>?

Je peux penser à deux façons:

public static IntStream foo(List<Integer> list)
{
    return list.stream().mapToInt(Integer::valueOf);
}

public static IntStream bar(List<Integer> list)
{
    return list.stream().mapToInt(x -> x);
}

Quelle est la voie idiomatique? Peut-être qu'il existe déjà une fonction de bibliothèque qui fait exactement ce que je veux?

44
fredoverflow

Je suppose (ou du moins c'est une alternative) de cette façon est plus performante:

public static IntStream baz(List<Integer> list)
{
    return list.stream().mapToInt(Integer::intValue);
}

puisque la fonction Integer::intValue est entièrement compatible avec ToIntFunction car il prend un Integer et retourne un int. Non autoboxing est effectué.

Je cherchais également un équivalent de Function::identity , j'espérais écrire un équivalent de votre méthode bar:

public static IntStream qux(List<Integer> list)
{
    return list.stream().mapToInt(IntFunction::identity);
}

mais ils n'ont pas fourni cette méthode identity. Je ne sais pas pourquoi.

48
gontard

Une autre façon de transformer ce serait d'utiliser Stream.flatMapToInt et IntStream.of comme:

public static IntStream foobar(List<Integer> list) {
    return list.stream().flatMapToInt(IntStream::of);
}

Remarque : J'ai parcouru quelques questions liées avant de poster ici et je n'ai tout simplement pas trouvé cela suggéré.

4
Naman