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::intValue
is volledig compatibel met ToIntFunction
omdat er een Integer
voor nodig is en een int
wordt 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.flatMapToInt
en IntStream.of
als:
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.