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
java java-8 mapping java-stream capitalization
add a comment |
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
java java-8 mapping java-stream capitalization
add a comment |
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
java java-8 mapping java-stream capitalization
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
java java-8 mapping java-stream capitalization
edited 7 hours ago
Andrew Tobilko
24.1k84081
24.1k84081
asked 7 hours ago
Devin
1067
1067
add a comment |
add a comment |
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));
- note that I've changed the comparator, which is essentially the idiomatic approach to do it.
- I've added a
map
operation after sorting to uppercase the first letter.
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
add a comment |
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);
1
This will exhibit better locality than the accepted answer, which splits the map on either side of the sort.
– Alex Reinking
54 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 person to the Streams API, talking about anything else is a bonus but takes things away from the their main point which is to simply uppercase the first character. btw, seems like now the OP knows that one can use more than one “same” intermediate operation :).
– Aomine
20 mins ago
add a comment |
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);
1
OP wants to capitalise only the first letter. Besides, you didn't mention whereWordUtils
comes from...
– Andrew Tobilko
7 hours ago
1
@AndrewTobilko WordUtils::capitalizeFully does just that. I have mentioned whereWordUtils
comes from now.
– fastcodejava
7 hours ago
1
New code should use thecommons-text
version of this method instead, as thecommons-lang
one has been deprecated.
– Alex Reinking
52 mins ago
add a comment |
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));
- note that I've changed the comparator, which is essentially the idiomatic approach to do it.
- I've added a
map
operation after sorting to uppercase the first letter.
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
add a comment |
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));
- note that I've changed the comparator, which is essentially the idiomatic approach to do it.
- I've added a
map
operation after sorting to uppercase the first letter.
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
add a comment |
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));
- note that I've changed the comparator, which is essentially the idiomatic approach to do it.
- I've added a
map
operation after sorting to uppercase the first letter.
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));
- note that I've changed the comparator, which is essentially the idiomatic approach to do it.
- I've added a
map
operation after sorting to uppercase the first letter.
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
add a comment |
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
add a comment |
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);
1
This will exhibit better locality than the accepted answer, which splits the map on either side of the sort.
– Alex Reinking
54 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 person to the Streams API, talking about anything else is a bonus but takes things away from the their main point which is to simply uppercase the first character. btw, seems like now the OP knows that one can use more than one “same” intermediate operation :).
– Aomine
20 mins ago
add a comment |
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);
1
This will exhibit better locality than the accepted answer, which splits the map on either side of the sort.
– Alex Reinking
54 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 person to the Streams API, talking about anything else is a bonus but takes things away from the their main point which is to simply uppercase the first character. btw, seems like now the OP knows that one can use more than one “same” intermediate operation :).
– Aomine
20 mins ago
add a comment |
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);
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);
edited 7 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
54 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 person to the Streams API, talking about anything else is a bonus but takes things away from the their main point which is to simply uppercase the first character. btw, seems like now the OP knows that one can use more than one “same” intermediate operation :).
– Aomine
20 mins ago
add a comment |
1
This will exhibit better locality than the accepted answer, which splits the map on either side of the sort.
– Alex Reinking
54 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 person to the Streams API, talking about anything else is a bonus but takes things away from the their main point which is to simply uppercase the first character. btw, seems like now the OP knows that one can use more than one “same” intermediate operation :).
– Aomine
20 mins ago
1
1
This will exhibit better locality than the accepted answer, which splits the map on either side of the sort.
– Alex Reinking
54 mins ago
This will exhibit better locality than the accepted answer, which splits the map on either side of the sort.
– Alex Reinking
54 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 person to the Streams API, talking about anything else is a bonus but takes things away from the their main point which is to simply uppercase the first character. btw, seems like now the OP knows that one can use more than one “same” intermediate operation :).
– Aomine
20 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 person to the Streams API, talking about anything else is a bonus but takes things away from the their main point which is to simply uppercase the first character. btw, seems like now the OP knows that one can use more than one “same” intermediate operation :).
– Aomine
20 mins ago
add a comment |
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);
1
OP wants to capitalise only the first letter. Besides, you didn't mention whereWordUtils
comes from...
– Andrew Tobilko
7 hours ago
1
@AndrewTobilko WordUtils::capitalizeFully does just that. I have mentioned whereWordUtils
comes from now.
– fastcodejava
7 hours ago
1
New code should use thecommons-text
version of this method instead, as thecommons-lang
one has been deprecated.
– Alex Reinking
52 mins ago
add a comment |
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);
1
OP wants to capitalise only the first letter. Besides, you didn't mention whereWordUtils
comes from...
– Andrew Tobilko
7 hours ago
1
@AndrewTobilko WordUtils::capitalizeFully does just that. I have mentioned whereWordUtils
comes from now.
– fastcodejava
7 hours ago
1
New code should use thecommons-text
version of this method instead, as thecommons-lang
one has been deprecated.
– Alex Reinking
52 mins ago
add a comment |
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);
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);
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 whereWordUtils
comes from...
– Andrew Tobilko
7 hours ago
1
@AndrewTobilko WordUtils::capitalizeFully does just that. I have mentioned whereWordUtils
comes from now.
– fastcodejava
7 hours ago
1
New code should use thecommons-text
version of this method instead, as thecommons-lang
one has been deprecated.
– Alex Reinking
52 mins ago
add a comment |
1
OP wants to capitalise only the first letter. Besides, you didn't mention whereWordUtils
comes from...
– Andrew Tobilko
7 hours ago
1
@AndrewTobilko WordUtils::capitalizeFully does just that. I have mentioned whereWordUtils
comes from now.
– fastcodejava
7 hours ago
1
New code should use thecommons-text
version of this method instead, as thecommons-lang
one has been deprecated.
– Alex Reinking
52 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
52 mins ago
New code should use the
commons-text
version of this method instead, as the commons-lang
one has been deprecated.– Alex Reinking
52 mins ago
add a comment |
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.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
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
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
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