Printing the letters from A to Z using Java stream
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
add a comment |
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
3
Related stackoverflow.com/a/32424763/1746118
– nullpointer
2 hours ago
add a comment |
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
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
java java-8 char java-stream
edited 2 hours ago
asked 6 hours ago
fastcodejava
23.9k19109161
23.9k19109161
3
Related stackoverflow.com/a/32424763/1746118
– nullpointer
2 hours ago
add a comment |
3
Related stackoverflow.com/a/32424763/1746118
– nullpointer
2 hours ago
3
3
Related stackoverflow.com/a/32424763/1746118
– nullpointer
2 hours ago
Related stackoverflow.com/a/32424763/1746118
– nullpointer
2 hours ago
add a comment |
2 Answers
2
active
oldest
votes
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:
- No boxing overhead thus more efficient
- if you were to stop at say letter
h
with the use ofiterate
you'd have to do more brain processing than just enteringh
as the upper bound withrangeClosed
because you'd need to find the number to truncate the infinite stream upon.
iterate
generates an infinite stream which again has more overhead than a finite one.
etc...
add a comment |
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
1
Good answer, would have been even better if you explain why++i
works andi + i
doesn't.
– fastcodejava
3 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
2 hours ago
2
1 👏🏻 for awesome explanation @GBlodgett
– Deadpool
1 hour ago
add a comment |
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
});
}
});
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%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
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:
- No boxing overhead thus more efficient
- if you were to stop at say letter
h
with the use ofiterate
you'd have to do more brain processing than just enteringh
as the upper bound withrangeClosed
because you'd need to find the number to truncate the infinite stream upon.
iterate
generates an infinite stream which again has more overhead than a finite one.
etc...
add a comment |
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:
- No boxing overhead thus more efficient
- if you were to stop at say letter
h
with the use ofiterate
you'd have to do more brain processing than just enteringh
as the upper bound withrangeClosed
because you'd need to find the number to truncate the infinite stream upon.
iterate
generates an infinite stream which again has more overhead than a finite one.
etc...
add a comment |
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:
- No boxing overhead thus more efficient
- if you were to stop at say letter
h
with the use ofiterate
you'd have to do more brain processing than just enteringh
as the upper bound withrangeClosed
because you'd need to find the number to truncate the infinite stream upon.
iterate
generates an infinite stream which again has more overhead than a finite one.
etc...
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:
- No boxing overhead thus more efficient
- if you were to stop at say letter
h
with the use ofiterate
you'd have to do more brain processing than just enteringh
as the upper bound withrangeClosed
because you'd need to find the number to truncate the infinite stream upon.
iterate
generates an infinite stream which again has more overhead than a finite one.
etc...
edited 5 hours ago
answered 6 hours ago
Aomine
39.1k73467
39.1k73467
add a comment |
add a comment |
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
1
Good answer, would have been even better if you explain why++i
works andi + i
doesn't.
– fastcodejava
3 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
2 hours ago
2
1 👏🏻 for awesome explanation @GBlodgett
– Deadpool
1 hour ago
add a comment |
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
1
Good answer, would have been even better if you explain why++i
works andi + i
doesn't.
– fastcodejava
3 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
2 hours ago
2
1 👏🏻 for awesome explanation @GBlodgett
– Deadpool
1 hour ago
add a comment |
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
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
edited 2 hours ago
answered 6 hours ago
GBlodgett
9,10641632
9,10641632
1
Good answer, would have been even better if you explain why++i
works andi + i
doesn't.
– fastcodejava
3 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
2 hours ago
2
1 👏🏻 for awesome explanation @GBlodgett
– Deadpool
1 hour ago
add a comment |
1
Good answer, would have been even better if you explain why++i
works andi + i
doesn't.
– fastcodejava
3 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
2 hours 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
3 hours ago
Good answer, would have been even better if you explain why
++i
works and i + i
doesn't.– fastcodejava
3 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
2 hours ago
@fastcodejava I have edited my answer to try to explain.
– GBlodgett
2 hours ago
2
2
1 👏🏻 for awesome explanation @GBlodgett
– Deadpool
1 hour ago
1 👏🏻 for awesome explanation @GBlodgett
– Deadpool
1 hour 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%2f53951142%2fprinting-the-letters-from-a-to-z-using-java-stream%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
3
Related stackoverflow.com/a/32424763/1746118
– nullpointer
2 hours ago