Using Streams with primitives data types and corresponding wrappers












15















While playing around with Java8's Streams-API, I stumbled over the following:



To convert an array of primitive wrapper classe objects into a Stream I just have to call Stream.of(array). But to convert an array of primitive data types, I have to call .of(array) from the corresponding wrapper (class) stream class (<-- that sounds silly).



An example:



final Integer integers = {1, 2, 3};
final int ints = {1, 2, 3};


Stream.of(integers).forEach(System.out::println); //That works just fine

Stream.of(ints).forEach(System.out::println); //That doesn't

IntStream.of(ints).forEach(System.out::println); //Have to use IntStream instead



My question(s):
Why is this? Does this correlate to e.g. the behaviour of Arrays.asList() which also just works for wrapper class arrays?










share|improve this question




















  • 4





    Isn't it normal to use IntStream methods to deal with IntStreams, and Stream methods to deal with Streams?

    – JB Nizet
    Apr 11 '14 at 8:35






  • 4





    You can also use Arrays.stream(ints).forEach(System.out::println).

    – skiwi
    Apr 11 '14 at 8:52











  • @skiwi That is really nice to know. Thanks

    – ifloop
    Apr 11 '14 at 8:59






  • 1





    Related to (but not a direct duplicate of) stackoverflow.com/q/14850879/2886891

    – Honza Zidek
    Feb 7 '18 at 22:18
















15















While playing around with Java8's Streams-API, I stumbled over the following:



To convert an array of primitive wrapper classe objects into a Stream I just have to call Stream.of(array). But to convert an array of primitive data types, I have to call .of(array) from the corresponding wrapper (class) stream class (<-- that sounds silly).



An example:



final Integer integers = {1, 2, 3};
final int ints = {1, 2, 3};


Stream.of(integers).forEach(System.out::println); //That works just fine

Stream.of(ints).forEach(System.out::println); //That doesn't

IntStream.of(ints).forEach(System.out::println); //Have to use IntStream instead



My question(s):
Why is this? Does this correlate to e.g. the behaviour of Arrays.asList() which also just works for wrapper class arrays?










share|improve this question




















  • 4





    Isn't it normal to use IntStream methods to deal with IntStreams, and Stream methods to deal with Streams?

    – JB Nizet
    Apr 11 '14 at 8:35






  • 4





    You can also use Arrays.stream(ints).forEach(System.out::println).

    – skiwi
    Apr 11 '14 at 8:52











  • @skiwi That is really nice to know. Thanks

    – ifloop
    Apr 11 '14 at 8:59






  • 1





    Related to (but not a direct duplicate of) stackoverflow.com/q/14850879/2886891

    – Honza Zidek
    Feb 7 '18 at 22:18














15












15








15








While playing around with Java8's Streams-API, I stumbled over the following:



To convert an array of primitive wrapper classe objects into a Stream I just have to call Stream.of(array). But to convert an array of primitive data types, I have to call .of(array) from the corresponding wrapper (class) stream class (<-- that sounds silly).



An example:



final Integer integers = {1, 2, 3};
final int ints = {1, 2, 3};


Stream.of(integers).forEach(System.out::println); //That works just fine

Stream.of(ints).forEach(System.out::println); //That doesn't

IntStream.of(ints).forEach(System.out::println); //Have to use IntStream instead



My question(s):
Why is this? Does this correlate to e.g. the behaviour of Arrays.asList() which also just works for wrapper class arrays?










share|improve this question
















While playing around with Java8's Streams-API, I stumbled over the following:



To convert an array of primitive wrapper classe objects into a Stream I just have to call Stream.of(array). But to convert an array of primitive data types, I have to call .of(array) from the corresponding wrapper (class) stream class (<-- that sounds silly).



An example:



final Integer integers = {1, 2, 3};
final int ints = {1, 2, 3};


Stream.of(integers).forEach(System.out::println); //That works just fine

Stream.of(ints).forEach(System.out::println); //That doesn't

IntStream.of(ints).forEach(System.out::println); //Have to use IntStream instead



My question(s):
Why is this? Does this correlate to e.g. the behaviour of Arrays.asList() which also just works for wrapper class arrays?







java wrapper java-8 primitive-types java-stream






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jul 29 '14 at 6:42









Stuart Marks

81.5k26137208




81.5k26137208










asked Apr 11 '14 at 8:31









ifloopifloop

5,14111835




5,14111835








  • 4





    Isn't it normal to use IntStream methods to deal with IntStreams, and Stream methods to deal with Streams?

    – JB Nizet
    Apr 11 '14 at 8:35






  • 4





    You can also use Arrays.stream(ints).forEach(System.out::println).

    – skiwi
    Apr 11 '14 at 8:52











  • @skiwi That is really nice to know. Thanks

    – ifloop
    Apr 11 '14 at 8:59






  • 1





    Related to (but not a direct duplicate of) stackoverflow.com/q/14850879/2886891

    – Honza Zidek
    Feb 7 '18 at 22:18














  • 4





    Isn't it normal to use IntStream methods to deal with IntStreams, and Stream methods to deal with Streams?

    – JB Nizet
    Apr 11 '14 at 8:35






  • 4





    You can also use Arrays.stream(ints).forEach(System.out::println).

    – skiwi
    Apr 11 '14 at 8:52











  • @skiwi That is really nice to know. Thanks

    – ifloop
    Apr 11 '14 at 8:59






  • 1





    Related to (but not a direct duplicate of) stackoverflow.com/q/14850879/2886891

    – Honza Zidek
    Feb 7 '18 at 22:18








4




4





Isn't it normal to use IntStream methods to deal with IntStreams, and Stream methods to deal with Streams?

– JB Nizet
Apr 11 '14 at 8:35





Isn't it normal to use IntStream methods to deal with IntStreams, and Stream methods to deal with Streams?

– JB Nizet
Apr 11 '14 at 8:35




4




4





You can also use Arrays.stream(ints).forEach(System.out::println).

– skiwi
Apr 11 '14 at 8:52





You can also use Arrays.stream(ints).forEach(System.out::println).

– skiwi
Apr 11 '14 at 8:52













@skiwi That is really nice to know. Thanks

– ifloop
Apr 11 '14 at 8:59





@skiwi That is really nice to know. Thanks

– ifloop
Apr 11 '14 at 8:59




1




1





Related to (but not a direct duplicate of) stackoverflow.com/q/14850879/2886891

– Honza Zidek
Feb 7 '18 at 22:18





Related to (but not a direct duplicate of) stackoverflow.com/q/14850879/2886891

– Honza Zidek
Feb 7 '18 at 22:18












1 Answer
1






active

oldest

votes


















20














Java 8 stream framework has a generic Stream<T> for objects as elements, and three primitive streams IntStream, LongStream, DoubleStream for the main three primitives. If you work with primitives, use one of those latter, in your case IntStream.



See the picture:



enter image description here



What lies behind is that:




  1. Java generics cannot work with primitive types: it is possible to have only List<Integer> and Stream<Integer>, but not List<int> and Stream<int>


  2. When the Java Collections framework was introduced, it was introduced only for classes, so if you want to have a List of ints, you have to wrap them to Integers. This is costly!


  3. When the Java Streams framework was introduced, they decided to get around this overhead and in parallel with the "class-oriented" streams (using the generics mechanism), they introduced three extra sets of all the library functions, specifically designed for the most important primitive types: int, long, double.



And see also a marvelous explanation here: https://stackoverflow.com/a/22919112/2886891






share|improve this answer

























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f23007422%2fusing-streams-with-primitives-data-types-and-corresponding-wrappers%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    20














    Java 8 stream framework has a generic Stream<T> for objects as elements, and three primitive streams IntStream, LongStream, DoubleStream for the main three primitives. If you work with primitives, use one of those latter, in your case IntStream.



    See the picture:



    enter image description here



    What lies behind is that:




    1. Java generics cannot work with primitive types: it is possible to have only List<Integer> and Stream<Integer>, but not List<int> and Stream<int>


    2. When the Java Collections framework was introduced, it was introduced only for classes, so if you want to have a List of ints, you have to wrap them to Integers. This is costly!


    3. When the Java Streams framework was introduced, they decided to get around this overhead and in parallel with the "class-oriented" streams (using the generics mechanism), they introduced three extra sets of all the library functions, specifically designed for the most important primitive types: int, long, double.



    And see also a marvelous explanation here: https://stackoverflow.com/a/22919112/2886891






    share|improve this answer






























      20














      Java 8 stream framework has a generic Stream<T> for objects as elements, and three primitive streams IntStream, LongStream, DoubleStream for the main three primitives. If you work with primitives, use one of those latter, in your case IntStream.



      See the picture:



      enter image description here



      What lies behind is that:




      1. Java generics cannot work with primitive types: it is possible to have only List<Integer> and Stream<Integer>, but not List<int> and Stream<int>


      2. When the Java Collections framework was introduced, it was introduced only for classes, so if you want to have a List of ints, you have to wrap them to Integers. This is costly!


      3. When the Java Streams framework was introduced, they decided to get around this overhead and in parallel with the "class-oriented" streams (using the generics mechanism), they introduced three extra sets of all the library functions, specifically designed for the most important primitive types: int, long, double.



      And see also a marvelous explanation here: https://stackoverflow.com/a/22919112/2886891






      share|improve this answer




























        20












        20








        20







        Java 8 stream framework has a generic Stream<T> for objects as elements, and three primitive streams IntStream, LongStream, DoubleStream for the main three primitives. If you work with primitives, use one of those latter, in your case IntStream.



        See the picture:



        enter image description here



        What lies behind is that:




        1. Java generics cannot work with primitive types: it is possible to have only List<Integer> and Stream<Integer>, but not List<int> and Stream<int>


        2. When the Java Collections framework was introduced, it was introduced only for classes, so if you want to have a List of ints, you have to wrap them to Integers. This is costly!


        3. When the Java Streams framework was introduced, they decided to get around this overhead and in parallel with the "class-oriented" streams (using the generics mechanism), they introduced three extra sets of all the library functions, specifically designed for the most important primitive types: int, long, double.



        And see also a marvelous explanation here: https://stackoverflow.com/a/22919112/2886891






        share|improve this answer















        Java 8 stream framework has a generic Stream<T> for objects as elements, and three primitive streams IntStream, LongStream, DoubleStream for the main three primitives. If you work with primitives, use one of those latter, in your case IntStream.



        See the picture:



        enter image description here



        What lies behind is that:




        1. Java generics cannot work with primitive types: it is possible to have only List<Integer> and Stream<Integer>, but not List<int> and Stream<int>


        2. When the Java Collections framework was introduced, it was introduced only for classes, so if you want to have a List of ints, you have to wrap them to Integers. This is costly!


        3. When the Java Streams framework was introduced, they decided to get around this overhead and in parallel with the "class-oriented" streams (using the generics mechanism), they introduced three extra sets of all the library functions, specifically designed for the most important primitive types: int, long, double.



        And see also a marvelous explanation here: https://stackoverflow.com/a/22919112/2886891







        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited Nov 21 '18 at 11:49

























        answered Apr 11 '14 at 10:48









        Honza ZidekHonza Zidek

        5,19523559




        5,19523559
































            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f23007422%2fusing-streams-with-primitives-data-types-and-corresponding-wrappers%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            MongoDB - Not Authorized To Execute Command

            How to fix TextFormField cause rebuild widget in Flutter

            in spring boot 2.1 many test slices are not allowed anymore due to multiple @BootstrapWith