Hoe krijg ik een IntStream van een List<Integer>?

Ik kan twee manieren bedenken:

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);
}

Wat is de idiomatische manier? Misschien is er al een bibliotheekfunctie die precies doet wat ik wil?


Antwoord 1, autoriteit 100%

Ik denk (of het is tenminste een alternatief) dat deze manier beter presteert:

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

sinds de functie Integer::intValueis volledig compatibel met ToIntFunctionomdat er een Integervoor nodig is en een intwordt geretourneerd. Er wordt geen autoboxinguitgevoerd.

Ik was ook op zoek naar een equivalent van Function::identity, ik hoopte een equivalent van uw bar-methode te schrijven:

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

maar ze hebben deze identity-methode niet verstrekt. Weet niet waarom.


Antwoord 2, autoriteit 9%

Een alternatieve manier om dat te transformeren is het gebruik van Stream.flatMapToInten IntStream.ofals:

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

Opmerking: Ik heb een paar gekoppelde vragen doorgenomen voordat ik ze hier plaatste en ik kon deze ook niet vinden.

Other episodes