2016-12-23 20 views
7

Próbuję zrobić coś takiego:Dlaczego nie ma IntStream.flatMapToObj()?

Stream<Object> stream = IntStream.of(...) 
     .flatMapToObj(i -> getStreamOfObjects(i)); 

Niestety IntStream.flatMapToObj() nie istnieje, nawet w Javie 9.

  1. Dlaczego został pominięty?
  2. Jakie jest zalecane obejście tego problemu?

Odpowiedz

10

Dlaczego został pominięty?

Interfejs API zapewnia klocki wielokrotnego użytku. Odpowiednie elementy konstrukcyjne to: IntStream, mapToObj, flatMap. Z nich możesz osiągnąć to, co chcesz: zamapuj strumień do obiektów, a następnie uzyskaj płaską mapę. Zapewnienie permutacji bloków konstrukcyjnych nie byłoby praktyczne i trudniejsze do przedłużenia.

Jakie jest zalecane obejście tego problemu?

Jak zasugerował wcześniej, korzystając z dostępnych cegiełki (mapToObj + flatMap)

Stream<Object> stream = IntStream.of(...) 
    .mapToObj(i -> Stream.of(...)) 
    .flatMap(...); 
+2

dobra odpowiedź. Myślę, że podświadomie zakładam, że 'IntStream.flatMapToObj()' był tak samo potrzebny jak 'Stream.flatMapToInt()', ale oczywiście tak nie jest. – shmosel

+2

to '.flatMap (...)' powinno być prawdopodobnie '.flatMap (Function.identity())', ponieważ już zmapowałeś do strumieni z mapToObj –

+1

Nie jestem aż tak przekonany - w API jesteśmy biorąc pod uwagę metodę '.boxed()', która powinna wyeliminować potrzebę '.mapToObj (...)', ponieważ wszystkie mogą być przepisane na '.boxed(). map (...)'. Wydaje się zatem niespójne dostarczenie '.mapToObj()' ('.boxed(). Map (...)'), ale nie '.flatMapToObj()' ('.boxed(). FlatMap()'). – MrPotes

6

Wystarczy napisać

IntStream.of(...).mapToObj(i -> getStreamOfObjects(i)).flatMap(stream -> stream) 
6

Korzystanie z pudełkowej strumień będzie działać, jeśli nie przeszkadza koszt boks każdą wartość int.

Stream<Object> stream = IntStream.of(...).boxed().flatMap(i -> getStreamOfObjects(i)); 
Powiązane problemy