Printing the letters from A to Z using Java stream












6














I have this code but it gives me an error: Type mismatch: cannot convert from int to Character.



Stream.iterate('a', i -> i + 1).limit(26).forEach(System.out::println);


Although it is fine to write int i = 'a';



I know I can write it like this but that seems like too much code for a simple task.



Stream.iterate('a', i -> (char)(i + 1)).limit(26).forEach(System.out::println);


Why is the Java type inference failing?










share|improve this question




















  • 2




    Related stackoverflow.com/a/32424763/1746118
    – nullpointer
    1 hour ago
















6














I have this code but it gives me an error: Type mismatch: cannot convert from int to Character.



Stream.iterate('a', i -> i + 1).limit(26).forEach(System.out::println);


Although it is fine to write int i = 'a';



I know I can write it like this but that seems like too much code for a simple task.



Stream.iterate('a', i -> (char)(i + 1)).limit(26).forEach(System.out::println);


Why is the Java type inference failing?










share|improve this question




















  • 2




    Related stackoverflow.com/a/32424763/1746118
    – nullpointer
    1 hour ago














6












6








6


1





I have this code but it gives me an error: Type mismatch: cannot convert from int to Character.



Stream.iterate('a', i -> i + 1).limit(26).forEach(System.out::println);


Although it is fine to write int i = 'a';



I know I can write it like this but that seems like too much code for a simple task.



Stream.iterate('a', i -> (char)(i + 1)).limit(26).forEach(System.out::println);


Why is the Java type inference failing?










share|improve this question















I have this code but it gives me an error: Type mismatch: cannot convert from int to Character.



Stream.iterate('a', i -> i + 1).limit(26).forEach(System.out::println);


Although it is fine to write int i = 'a';



I know I can write it like this but that seems like too much code for a simple task.



Stream.iterate('a', i -> (char)(i + 1)).limit(26).forEach(System.out::println);


Why is the Java type inference failing?







java java-8 char java-stream






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited 2 hours ago

























asked 5 hours ago









fastcodejava

23.9k19109161




23.9k19109161








  • 2




    Related stackoverflow.com/a/32424763/1746118
    – nullpointer
    1 hour ago














  • 2




    Related stackoverflow.com/a/32424763/1746118
    – nullpointer
    1 hour ago








2




2




Related stackoverflow.com/a/32424763/1746118
– nullpointer
1 hour ago




Related stackoverflow.com/a/32424763/1746118
– nullpointer
1 hour ago












2 Answers
2






active

oldest

votes


















10














The reason why i -> i + 1 does not compile is because you're attempting to implicitly convert an int to a Character which the compiler cannot do itself alone.



In other words, you can think of Stream.iterate('a', i -> i + 1) as:



Stream.iterate('a', (Character i) -> {
int i1 = i + 1;
return i1; // not possible
});


As you have noted, explicitly casting to char solves it:



Stream.iterate('a', i -> (char)(i + 1))...


Btw this is better done as:



IntStream.rangeClosed('a', 'z').forEach(c -> System.out.println((char)c));


This is better because:




  1. No boxing overhead thus more efficient

  2. if you were to stop at say letter h with the use of iterate you'd have to do more brain processing than just entering h as the upper bound with rangeClosed because you'd need to find the number to truncate the infinite stream upon.


  3. iterate generates an infinite stream which again has more overhead than a finite one.


etc...






share|improve this answer































    7














    How about just:



    Stream.iterate('a', i -> ++i).limit(26).forEach(System.out::println);




    i -> i + 1 does not work because i is a Character and i + 1 causes an implicit narrowing conversion (JLS 5.1.3), which is not allowed. You can explicitly cast it as was shown. However ++i works because (From JLS 15.15.1):




    Before the addition, binary numeric promotion (§5.6.2) is performed on the value 1 and the value of the variable. If necessary, the sum is narrowed by a narrowing primitive conversion (§5.1.3) and/or subjected to boxing conversion (§5.1.7) to the type of the variable before it is stored.




    The ++ operator takes care of the narrowing conversion without us having to explicitly cast it






    share|improve this answer



















    • 1




      Good answer, would have been even better if you explain why ++i works and i + i doesn't.
      – fastcodejava
      2 hours ago






    • 1




      and much better if you could also answer Why is the Java type inference is failing part specifically :)
      – nullpointer
      2 hours ago






    • 1




      @fastcodejava I have edited my answer to try to explain.
      – GBlodgett
      1 hour ago






    • 2




      1 👏🏻 for awesome explanation @GBlodgett
      – Deadpool
      1 hour ago











    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%2f53951142%2fprinting-the-letters-from-a-to-z-using-java-stream%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    2 Answers
    2






    active

    oldest

    votes








    2 Answers
    2






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    10














    The reason why i -> i + 1 does not compile is because you're attempting to implicitly convert an int to a Character which the compiler cannot do itself alone.



    In other words, you can think of Stream.iterate('a', i -> i + 1) as:



    Stream.iterate('a', (Character i) -> {
    int i1 = i + 1;
    return i1; // not possible
    });


    As you have noted, explicitly casting to char solves it:



    Stream.iterate('a', i -> (char)(i + 1))...


    Btw this is better done as:



    IntStream.rangeClosed('a', 'z').forEach(c -> System.out.println((char)c));


    This is better because:




    1. No boxing overhead thus more efficient

    2. if you were to stop at say letter h with the use of iterate you'd have to do more brain processing than just entering h as the upper bound with rangeClosed because you'd need to find the number to truncate the infinite stream upon.


    3. iterate generates an infinite stream which again has more overhead than a finite one.


    etc...






    share|improve this answer




























      10














      The reason why i -> i + 1 does not compile is because you're attempting to implicitly convert an int to a Character which the compiler cannot do itself alone.



      In other words, you can think of Stream.iterate('a', i -> i + 1) as:



      Stream.iterate('a', (Character i) -> {
      int i1 = i + 1;
      return i1; // not possible
      });


      As you have noted, explicitly casting to char solves it:



      Stream.iterate('a', i -> (char)(i + 1))...


      Btw this is better done as:



      IntStream.rangeClosed('a', 'z').forEach(c -> System.out.println((char)c));


      This is better because:




      1. No boxing overhead thus more efficient

      2. if you were to stop at say letter h with the use of iterate you'd have to do more brain processing than just entering h as the upper bound with rangeClosed because you'd need to find the number to truncate the infinite stream upon.


      3. iterate generates an infinite stream which again has more overhead than a finite one.


      etc...






      share|improve this answer


























        10












        10








        10






        The reason why i -> i + 1 does not compile is because you're attempting to implicitly convert an int to a Character which the compiler cannot do itself alone.



        In other words, you can think of Stream.iterate('a', i -> i + 1) as:



        Stream.iterate('a', (Character i) -> {
        int i1 = i + 1;
        return i1; // not possible
        });


        As you have noted, explicitly casting to char solves it:



        Stream.iterate('a', i -> (char)(i + 1))...


        Btw this is better done as:



        IntStream.rangeClosed('a', 'z').forEach(c -> System.out.println((char)c));


        This is better because:




        1. No boxing overhead thus more efficient

        2. if you were to stop at say letter h with the use of iterate you'd have to do more brain processing than just entering h as the upper bound with rangeClosed because you'd need to find the number to truncate the infinite stream upon.


        3. iterate generates an infinite stream which again has more overhead than a finite one.


        etc...






        share|improve this answer














        The reason why i -> i + 1 does not compile is because you're attempting to implicitly convert an int to a Character which the compiler cannot do itself alone.



        In other words, you can think of Stream.iterate('a', i -> i + 1) as:



        Stream.iterate('a', (Character i) -> {
        int i1 = i + 1;
        return i1; // not possible
        });


        As you have noted, explicitly casting to char solves it:



        Stream.iterate('a', i -> (char)(i + 1))...


        Btw this is better done as:



        IntStream.rangeClosed('a', 'z').forEach(c -> System.out.println((char)c));


        This is better because:




        1. No boxing overhead thus more efficient

        2. if you were to stop at say letter h with the use of iterate you'd have to do more brain processing than just entering h as the upper bound with rangeClosed because you'd need to find the number to truncate the infinite stream upon.


        3. iterate generates an infinite stream which again has more overhead than a finite one.


        etc...







        share|improve this answer














        share|improve this answer



        share|improve this answer








        edited 4 hours ago

























        answered 5 hours ago









        Aomine

        39.1k73467




        39.1k73467

























            7














            How about just:



            Stream.iterate('a', i -> ++i).limit(26).forEach(System.out::println);




            i -> i + 1 does not work because i is a Character and i + 1 causes an implicit narrowing conversion (JLS 5.1.3), which is not allowed. You can explicitly cast it as was shown. However ++i works because (From JLS 15.15.1):




            Before the addition, binary numeric promotion (§5.6.2) is performed on the value 1 and the value of the variable. If necessary, the sum is narrowed by a narrowing primitive conversion (§5.1.3) and/or subjected to boxing conversion (§5.1.7) to the type of the variable before it is stored.




            The ++ operator takes care of the narrowing conversion without us having to explicitly cast it






            share|improve this answer



















            • 1




              Good answer, would have been even better if you explain why ++i works and i + i doesn't.
              – fastcodejava
              2 hours ago






            • 1




              and much better if you could also answer Why is the Java type inference is failing part specifically :)
              – nullpointer
              2 hours ago






            • 1




              @fastcodejava I have edited my answer to try to explain.
              – GBlodgett
              1 hour ago






            • 2




              1 👏🏻 for awesome explanation @GBlodgett
              – Deadpool
              1 hour ago
















            7














            How about just:



            Stream.iterate('a', i -> ++i).limit(26).forEach(System.out::println);




            i -> i + 1 does not work because i is a Character and i + 1 causes an implicit narrowing conversion (JLS 5.1.3), which is not allowed. You can explicitly cast it as was shown. However ++i works because (From JLS 15.15.1):




            Before the addition, binary numeric promotion (§5.6.2) is performed on the value 1 and the value of the variable. If necessary, the sum is narrowed by a narrowing primitive conversion (§5.1.3) and/or subjected to boxing conversion (§5.1.7) to the type of the variable before it is stored.




            The ++ operator takes care of the narrowing conversion without us having to explicitly cast it






            share|improve this answer



















            • 1




              Good answer, would have been even better if you explain why ++i works and i + i doesn't.
              – fastcodejava
              2 hours ago






            • 1




              and much better if you could also answer Why is the Java type inference is failing part specifically :)
              – nullpointer
              2 hours ago






            • 1




              @fastcodejava I have edited my answer to try to explain.
              – GBlodgett
              1 hour ago






            • 2




              1 👏🏻 for awesome explanation @GBlodgett
              – Deadpool
              1 hour ago














            7












            7








            7






            How about just:



            Stream.iterate('a', i -> ++i).limit(26).forEach(System.out::println);




            i -> i + 1 does not work because i is a Character and i + 1 causes an implicit narrowing conversion (JLS 5.1.3), which is not allowed. You can explicitly cast it as was shown. However ++i works because (From JLS 15.15.1):




            Before the addition, binary numeric promotion (§5.6.2) is performed on the value 1 and the value of the variable. If necessary, the sum is narrowed by a narrowing primitive conversion (§5.1.3) and/or subjected to boxing conversion (§5.1.7) to the type of the variable before it is stored.




            The ++ operator takes care of the narrowing conversion without us having to explicitly cast it






            share|improve this answer














            How about just:



            Stream.iterate('a', i -> ++i).limit(26).forEach(System.out::println);




            i -> i + 1 does not work because i is a Character and i + 1 causes an implicit narrowing conversion (JLS 5.1.3), which is not allowed. You can explicitly cast it as was shown. However ++i works because (From JLS 15.15.1):




            Before the addition, binary numeric promotion (§5.6.2) is performed on the value 1 and the value of the variable. If necessary, the sum is narrowed by a narrowing primitive conversion (§5.1.3) and/or subjected to boxing conversion (§5.1.7) to the type of the variable before it is stored.




            The ++ operator takes care of the narrowing conversion without us having to explicitly cast it







            share|improve this answer














            share|improve this answer



            share|improve this answer








            edited 1 hour ago

























            answered 5 hours ago









            GBlodgett

            9,10641632




            9,10641632








            • 1




              Good answer, would have been even better if you explain why ++i works and i + i doesn't.
              – fastcodejava
              2 hours ago






            • 1




              and much better if you could also answer Why is the Java type inference is failing part specifically :)
              – nullpointer
              2 hours ago






            • 1




              @fastcodejava I have edited my answer to try to explain.
              – GBlodgett
              1 hour ago






            • 2




              1 👏🏻 for awesome explanation @GBlodgett
              – Deadpool
              1 hour ago














            • 1




              Good answer, would have been even better if you explain why ++i works and i + i doesn't.
              – fastcodejava
              2 hours ago






            • 1




              and much better if you could also answer Why is the Java type inference is failing part specifically :)
              – nullpointer
              2 hours ago






            • 1




              @fastcodejava I have edited my answer to try to explain.
              – GBlodgett
              1 hour ago






            • 2




              1 👏🏻 for awesome explanation @GBlodgett
              – Deadpool
              1 hour ago








            1




            1




            Good answer, would have been even better if you explain why ++i works and i + i doesn't.
            – fastcodejava
            2 hours ago




            Good answer, would have been even better if you explain why ++i works and i + i doesn't.
            – fastcodejava
            2 hours ago




            1




            1




            and much better if you could also answer Why is the Java type inference is failing part specifically :)
            – nullpointer
            2 hours ago




            and much better if you could also answer Why is the Java type inference is failing part specifically :)
            – nullpointer
            2 hours ago




            1




            1




            @fastcodejava I have edited my answer to try to explain.
            – GBlodgett
            1 hour ago




            @fastcodejava I have edited my answer to try to explain.
            – GBlodgett
            1 hour ago




            2




            2




            1 👏🏻 for awesome explanation @GBlodgett
            – Deadpool
            1 hour ago




            1 👏🏻 for awesome explanation @GBlodgett
            – Deadpool
            1 hour ago


















            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.





            Some of your past answers have not been well-received, and you're in danger of being blocked from answering.


            Please pay close attention to the following guidance:


            • 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%2f53951142%2fprinting-the-letters-from-a-to-z-using-java-stream%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

            Accessing regular linux commands in Huawei's Dopra Linux

            Can't connect RFCOMM socket: Host is down

            Kernel panic - not syncing: Fatal Exception in Interrupt