Using stream api to set strings all lowercase but capitalize first letter











up vote
7
down vote

favorite












I have strings in a list and through only using the stream api I was settings all strings to lowercase, sorting them from smallest string to largest and printing them. The issue I'm having is capitalizing the first letter of the string. Is that something I do through .stream().map()?



Main:



public static void main(String args) {

List<String> list = Arrays.asList("SOmE", "StriNgs", "fRom", "mE", "To", "yOU");
list.stream().map(n -> n.toLowerCase())
.sorted((a, b) -> a.length() - b.length())
.forEach(n -> System.out.println(n));;

}


Output:



me
to
you
some
from
strings


Desired output:



Me
To
You
Some
From
Strings









share|improve this question




























    up vote
    7
    down vote

    favorite












    I have strings in a list and through only using the stream api I was settings all strings to lowercase, sorting them from smallest string to largest and printing them. The issue I'm having is capitalizing the first letter of the string. Is that something I do through .stream().map()?



    Main:



    public static void main(String args) {

    List<String> list = Arrays.asList("SOmE", "StriNgs", "fRom", "mE", "To", "yOU");
    list.stream().map(n -> n.toLowerCase())
    .sorted((a, b) -> a.length() - b.length())
    .forEach(n -> System.out.println(n));;

    }


    Output:



    me
    to
    you
    some
    from
    strings


    Desired output:



    Me
    To
    You
    Some
    From
    Strings









    share|improve this question


























      up vote
      7
      down vote

      favorite









      up vote
      7
      down vote

      favorite











      I have strings in a list and through only using the stream api I was settings all strings to lowercase, sorting them from smallest string to largest and printing them. The issue I'm having is capitalizing the first letter of the string. Is that something I do through .stream().map()?



      Main:



      public static void main(String args) {

      List<String> list = Arrays.asList("SOmE", "StriNgs", "fRom", "mE", "To", "yOU");
      list.stream().map(n -> n.toLowerCase())
      .sorted((a, b) -> a.length() - b.length())
      .forEach(n -> System.out.println(n));;

      }


      Output:



      me
      to
      you
      some
      from
      strings


      Desired output:



      Me
      To
      You
      Some
      From
      Strings









      share|improve this question















      I have strings in a list and through only using the stream api I was settings all strings to lowercase, sorting them from smallest string to largest and printing them. The issue I'm having is capitalizing the first letter of the string. Is that something I do through .stream().map()?



      Main:



      public static void main(String args) {

      List<String> list = Arrays.asList("SOmE", "StriNgs", "fRom", "mE", "To", "yOU");
      list.stream().map(n -> n.toLowerCase())
      .sorted((a, b) -> a.length() - b.length())
      .forEach(n -> System.out.println(n));;

      }


      Output:



      me
      to
      you
      some
      from
      strings


      Desired output:



      Me
      To
      You
      Some
      From
      Strings






      java java-8 mapping java-stream capitalization






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 7 hours ago









      Andrew Tobilko

      24.1k84081




      24.1k84081










      asked 7 hours ago









      Devin

      1067




      1067
























          3 Answers
          3






          active

          oldest

          votes

















          up vote
          7
          down vote



          accepted










          Something like this should suffice:



           list.stream()
          .map(n -> n.toLowerCase())
          .sorted(Comparator.comparingInt(String::length))
          .map(s -> Character.toUpperCase(s.charAt(0)) + s.substring(1))
          .forEach(n -> System.out.println(n));



          1. note that I've changed the comparator, which is essentially the idiomatic approach to do it.

          2. I've added a map operation after sorting to uppercase the first letter.






          share|improve this answer





















          • Yes that works, thank you! I was unaware I could use Map multiple times for the same stream.
            – Devin
            7 hours ago






          • 1




            @Devin you can chain as many intermediate operations as you like.
            – Aomine
            7 hours ago


















          up vote
          10
          down vote













          list.stream()
          .map(s -> s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase())
          .sorted(Comparator.comparingInt(String::length))
          .forEach(System.out::println);


          For readability, the line performing capitalisation should be moved into a method,



          public class StringUtils {
          public static String capitalise(String s) {
          return s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase();
          }
          }


          so you can refer to it via an eloquent method reference:



          list.stream()
          .map(StringUtils::capitalise)
          .sorted(Comparator.comparingInt(String::length))
          .forEach(System.out::println);





          share|improve this answer



















          • 1




            This will exhibit better locality than the accepted answer, which splits the map on either side of the sort.
            – Alex Reinking
            34 mins ago










          • @AlexReinking While a agree with you, I just want to point out that the only reason why I’ve decided against using one map operation at the time of posting was to keep the logic on each intermediate operation short and easy see to follow thus making it easier for the OP. Remember at the end of the day, the OP seems like a new persons to the Streams API, just talking about anything else just takes things away from the their main point which is to simply uppercase the first character. But again yes I agree with you.
            – Aomine
            just now


















          up vote
          3
          down vote













          You can use WordUtils::capitalizeFully from apache commons-lang for this.



           list.stream()
          .sorted(Comparator.comparingInt(String::length))
          .map(WordUtils::capitalizeFully)
          .forEach(System.out::println);





          share|improve this answer



















          • 1




            OP wants to capitalise only the first letter. Besides, you didn't mention where WordUtils comes from...
            – Andrew Tobilko
            7 hours ago






          • 1




            @AndrewTobilko WordUtils::capitalizeFully does just that. I have mentioned where WordUtils comes from now.
            – fastcodejava
            7 hours ago






          • 1




            New code should use the commons-text version of this method instead, as the commons-lang one has been deprecated.
            – Alex Reinking
            32 mins 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',
          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%2f53733777%2fusing-stream-api-to-set-strings-all-lowercase-but-capitalize-first-letter%23new-answer', 'question_page');
          }
          );

          Post as a guest















          Required, but never shown

























          3 Answers
          3






          active

          oldest

          votes








          3 Answers
          3






          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes








          up vote
          7
          down vote



          accepted










          Something like this should suffice:



           list.stream()
          .map(n -> n.toLowerCase())
          .sorted(Comparator.comparingInt(String::length))
          .map(s -> Character.toUpperCase(s.charAt(0)) + s.substring(1))
          .forEach(n -> System.out.println(n));



          1. note that I've changed the comparator, which is essentially the idiomatic approach to do it.

          2. I've added a map operation after sorting to uppercase the first letter.






          share|improve this answer





















          • Yes that works, thank you! I was unaware I could use Map multiple times for the same stream.
            – Devin
            7 hours ago






          • 1




            @Devin you can chain as many intermediate operations as you like.
            – Aomine
            7 hours ago















          up vote
          7
          down vote



          accepted










          Something like this should suffice:



           list.stream()
          .map(n -> n.toLowerCase())
          .sorted(Comparator.comparingInt(String::length))
          .map(s -> Character.toUpperCase(s.charAt(0)) + s.substring(1))
          .forEach(n -> System.out.println(n));



          1. note that I've changed the comparator, which is essentially the idiomatic approach to do it.

          2. I've added a map operation after sorting to uppercase the first letter.






          share|improve this answer





















          • Yes that works, thank you! I was unaware I could use Map multiple times for the same stream.
            – Devin
            7 hours ago






          • 1




            @Devin you can chain as many intermediate operations as you like.
            – Aomine
            7 hours ago













          up vote
          7
          down vote



          accepted







          up vote
          7
          down vote



          accepted






          Something like this should suffice:



           list.stream()
          .map(n -> n.toLowerCase())
          .sorted(Comparator.comparingInt(String::length))
          .map(s -> Character.toUpperCase(s.charAt(0)) + s.substring(1))
          .forEach(n -> System.out.println(n));



          1. note that I've changed the comparator, which is essentially the idiomatic approach to do it.

          2. I've added a map operation after sorting to uppercase the first letter.






          share|improve this answer












          Something like this should suffice:



           list.stream()
          .map(n -> n.toLowerCase())
          .sorted(Comparator.comparingInt(String::length))
          .map(s -> Character.toUpperCase(s.charAt(0)) + s.substring(1))
          .forEach(n -> System.out.println(n));



          1. note that I've changed the comparator, which is essentially the idiomatic approach to do it.

          2. I've added a map operation after sorting to uppercase the first letter.







          share|improve this answer












          share|improve this answer



          share|improve this answer










          answered 7 hours ago









          Aomine

          35.7k62859




          35.7k62859












          • Yes that works, thank you! I was unaware I could use Map multiple times for the same stream.
            – Devin
            7 hours ago






          • 1




            @Devin you can chain as many intermediate operations as you like.
            – Aomine
            7 hours ago


















          • Yes that works, thank you! I was unaware I could use Map multiple times for the same stream.
            – Devin
            7 hours ago






          • 1




            @Devin you can chain as many intermediate operations as you like.
            – Aomine
            7 hours ago
















          Yes that works, thank you! I was unaware I could use Map multiple times for the same stream.
          – Devin
          7 hours ago




          Yes that works, thank you! I was unaware I could use Map multiple times for the same stream.
          – Devin
          7 hours ago




          1




          1




          @Devin you can chain as many intermediate operations as you like.
          – Aomine
          7 hours ago




          @Devin you can chain as many intermediate operations as you like.
          – Aomine
          7 hours ago












          up vote
          10
          down vote













          list.stream()
          .map(s -> s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase())
          .sorted(Comparator.comparingInt(String::length))
          .forEach(System.out::println);


          For readability, the line performing capitalisation should be moved into a method,



          public class StringUtils {
          public static String capitalise(String s) {
          return s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase();
          }
          }


          so you can refer to it via an eloquent method reference:



          list.stream()
          .map(StringUtils::capitalise)
          .sorted(Comparator.comparingInt(String::length))
          .forEach(System.out::println);





          share|improve this answer



















          • 1




            This will exhibit better locality than the accepted answer, which splits the map on either side of the sort.
            – Alex Reinking
            34 mins ago










          • @AlexReinking While a agree with you, I just want to point out that the only reason why I’ve decided against using one map operation at the time of posting was to keep the logic on each intermediate operation short and easy see to follow thus making it easier for the OP. Remember at the end of the day, the OP seems like a new persons to the Streams API, just talking about anything else just takes things away from the their main point which is to simply uppercase the first character. But again yes I agree with you.
            – Aomine
            just now















          up vote
          10
          down vote













          list.stream()
          .map(s -> s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase())
          .sorted(Comparator.comparingInt(String::length))
          .forEach(System.out::println);


          For readability, the line performing capitalisation should be moved into a method,



          public class StringUtils {
          public static String capitalise(String s) {
          return s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase();
          }
          }


          so you can refer to it via an eloquent method reference:



          list.stream()
          .map(StringUtils::capitalise)
          .sorted(Comparator.comparingInt(String::length))
          .forEach(System.out::println);





          share|improve this answer



















          • 1




            This will exhibit better locality than the accepted answer, which splits the map on either side of the sort.
            – Alex Reinking
            34 mins ago










          • @AlexReinking While a agree with you, I just want to point out that the only reason why I’ve decided against using one map operation at the time of posting was to keep the logic on each intermediate operation short and easy see to follow thus making it easier for the OP. Remember at the end of the day, the OP seems like a new persons to the Streams API, just talking about anything else just takes things away from the their main point which is to simply uppercase the first character. But again yes I agree with you.
            – Aomine
            just now













          up vote
          10
          down vote










          up vote
          10
          down vote









          list.stream()
          .map(s -> s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase())
          .sorted(Comparator.comparingInt(String::length))
          .forEach(System.out::println);


          For readability, the line performing capitalisation should be moved into a method,



          public class StringUtils {
          public static String capitalise(String s) {
          return s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase();
          }
          }


          so you can refer to it via an eloquent method reference:



          list.stream()
          .map(StringUtils::capitalise)
          .sorted(Comparator.comparingInt(String::length))
          .forEach(System.out::println);





          share|improve this answer














          list.stream()
          .map(s -> s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase())
          .sorted(Comparator.comparingInt(String::length))
          .forEach(System.out::println);


          For readability, the line performing capitalisation should be moved into a method,



          public class StringUtils {
          public static String capitalise(String s) {
          return s.substring(0, 1).toUpperCase() + s.substring(1).toLowerCase();
          }
          }


          so you can refer to it via an eloquent method reference:



          list.stream()
          .map(StringUtils::capitalise)
          .sorted(Comparator.comparingInt(String::length))
          .forEach(System.out::println);






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited 6 hours ago

























          answered 7 hours ago









          Andrew Tobilko

          24.1k84081




          24.1k84081








          • 1




            This will exhibit better locality than the accepted answer, which splits the map on either side of the sort.
            – Alex Reinking
            34 mins ago










          • @AlexReinking While a agree with you, I just want to point out that the only reason why I’ve decided against using one map operation at the time of posting was to keep the logic on each intermediate operation short and easy see to follow thus making it easier for the OP. Remember at the end of the day, the OP seems like a new persons to the Streams API, just talking about anything else just takes things away from the their main point which is to simply uppercase the first character. But again yes I agree with you.
            – Aomine
            just now














          • 1




            This will exhibit better locality than the accepted answer, which splits the map on either side of the sort.
            – Alex Reinking
            34 mins ago










          • @AlexReinking While a agree with you, I just want to point out that the only reason why I’ve decided against using one map operation at the time of posting was to keep the logic on each intermediate operation short and easy see to follow thus making it easier for the OP. Remember at the end of the day, the OP seems like a new persons to the Streams API, just talking about anything else just takes things away from the their main point which is to simply uppercase the first character. But again yes I agree with you.
            – Aomine
            just now








          1




          1




          This will exhibit better locality than the accepted answer, which splits the map on either side of the sort.
          – Alex Reinking
          34 mins ago




          This will exhibit better locality than the accepted answer, which splits the map on either side of the sort.
          – Alex Reinking
          34 mins ago












          @AlexReinking While a agree with you, I just want to point out that the only reason why I’ve decided against using one map operation at the time of posting was to keep the logic on each intermediate operation short and easy see to follow thus making it easier for the OP. Remember at the end of the day, the OP seems like a new persons to the Streams API, just talking about anything else just takes things away from the their main point which is to simply uppercase the first character. But again yes I agree with you.
          – Aomine
          just now




          @AlexReinking While a agree with you, I just want to point out that the only reason why I’ve decided against using one map operation at the time of posting was to keep the logic on each intermediate operation short and easy see to follow thus making it easier for the OP. Remember at the end of the day, the OP seems like a new persons to the Streams API, just talking about anything else just takes things away from the their main point which is to simply uppercase the first character. But again yes I agree with you.
          – Aomine
          just now










          up vote
          3
          down vote













          You can use WordUtils::capitalizeFully from apache commons-lang for this.



           list.stream()
          .sorted(Comparator.comparingInt(String::length))
          .map(WordUtils::capitalizeFully)
          .forEach(System.out::println);





          share|improve this answer



















          • 1




            OP wants to capitalise only the first letter. Besides, you didn't mention where WordUtils comes from...
            – Andrew Tobilko
            7 hours ago






          • 1




            @AndrewTobilko WordUtils::capitalizeFully does just that. I have mentioned where WordUtils comes from now.
            – fastcodejava
            7 hours ago






          • 1




            New code should use the commons-text version of this method instead, as the commons-lang one has been deprecated.
            – Alex Reinking
            32 mins ago

















          up vote
          3
          down vote













          You can use WordUtils::capitalizeFully from apache commons-lang for this.



           list.stream()
          .sorted(Comparator.comparingInt(String::length))
          .map(WordUtils::capitalizeFully)
          .forEach(System.out::println);





          share|improve this answer



















          • 1




            OP wants to capitalise only the first letter. Besides, you didn't mention where WordUtils comes from...
            – Andrew Tobilko
            7 hours ago






          • 1




            @AndrewTobilko WordUtils::capitalizeFully does just that. I have mentioned where WordUtils comes from now.
            – fastcodejava
            7 hours ago






          • 1




            New code should use the commons-text version of this method instead, as the commons-lang one has been deprecated.
            – Alex Reinking
            32 mins ago















          up vote
          3
          down vote










          up vote
          3
          down vote









          You can use WordUtils::capitalizeFully from apache commons-lang for this.



           list.stream()
          .sorted(Comparator.comparingInt(String::length))
          .map(WordUtils::capitalizeFully)
          .forEach(System.out::println);





          share|improve this answer














          You can use WordUtils::capitalizeFully from apache commons-lang for this.



           list.stream()
          .sorted(Comparator.comparingInt(String::length))
          .map(WordUtils::capitalizeFully)
          .forEach(System.out::println);






          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited 7 hours ago

























          answered 7 hours ago









          fastcodejava

          23.7k19109160




          23.7k19109160








          • 1




            OP wants to capitalise only the first letter. Besides, you didn't mention where WordUtils comes from...
            – Andrew Tobilko
            7 hours ago






          • 1




            @AndrewTobilko WordUtils::capitalizeFully does just that. I have mentioned where WordUtils comes from now.
            – fastcodejava
            7 hours ago






          • 1




            New code should use the commons-text version of this method instead, as the commons-lang one has been deprecated.
            – Alex Reinking
            32 mins ago
















          • 1




            OP wants to capitalise only the first letter. Besides, you didn't mention where WordUtils comes from...
            – Andrew Tobilko
            7 hours ago






          • 1




            @AndrewTobilko WordUtils::capitalizeFully does just that. I have mentioned where WordUtils comes from now.
            – fastcodejava
            7 hours ago






          • 1




            New code should use the commons-text version of this method instead, as the commons-lang one has been deprecated.
            – Alex Reinking
            32 mins ago










          1




          1




          OP wants to capitalise only the first letter. Besides, you didn't mention where WordUtils comes from...
          – Andrew Tobilko
          7 hours ago




          OP wants to capitalise only the first letter. Besides, you didn't mention where WordUtils comes from...
          – Andrew Tobilko
          7 hours ago




          1




          1




          @AndrewTobilko WordUtils::capitalizeFully does just that. I have mentioned where WordUtils comes from now.
          – fastcodejava
          7 hours ago




          @AndrewTobilko WordUtils::capitalizeFully does just that. I have mentioned where WordUtils comes from now.
          – fastcodejava
          7 hours ago




          1




          1




          New code should use the commons-text version of this method instead, as the commons-lang one has been deprecated.
          – Alex Reinking
          32 mins ago






          New code should use the commons-text version of this method instead, as the commons-lang one has been deprecated.
          – Alex Reinking
          32 mins 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%2f53733777%2fusing-stream-api-to-set-strings-all-lowercase-but-capitalize-first-letter%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

          404 Error Contact Form 7 ajax form submitting

          How to know if a Active Directory user can login interactively

          TypeError: fit_transform() missing 1 required positional argument: 'X'