Filtering out empty Optionals











up vote
14
down vote

favorite
2












I want to convert my list of optional strings to a list of strings by getting rid of the empty Optionals.



Is there a shorter version for achieving this than the following code (except statically importing the methods of Collectors)?



List<Optional<String>> stringsMaybe = Arrays.asList(Optional.of("Hi"),
Optional.empty(), Optional.of(" there!"));

List<String> strings = stringsMaybe
.stream()
.filter(Optional::isPresent)
.collect(Collectors.mapping(Optional::get, Collectors.toList()));









share|improve this question




























    up vote
    14
    down vote

    favorite
    2












    I want to convert my list of optional strings to a list of strings by getting rid of the empty Optionals.



    Is there a shorter version for achieving this than the following code (except statically importing the methods of Collectors)?



    List<Optional<String>> stringsMaybe = Arrays.asList(Optional.of("Hi"),
    Optional.empty(), Optional.of(" there!"));

    List<String> strings = stringsMaybe
    .stream()
    .filter(Optional::isPresent)
    .collect(Collectors.mapping(Optional::get, Collectors.toList()));









    share|improve this question


























      up vote
      14
      down vote

      favorite
      2









      up vote
      14
      down vote

      favorite
      2






      2





      I want to convert my list of optional strings to a list of strings by getting rid of the empty Optionals.



      Is there a shorter version for achieving this than the following code (except statically importing the methods of Collectors)?



      List<Optional<String>> stringsMaybe = Arrays.asList(Optional.of("Hi"),
      Optional.empty(), Optional.of(" there!"));

      List<String> strings = stringsMaybe
      .stream()
      .filter(Optional::isPresent)
      .collect(Collectors.mapping(Optional::get, Collectors.toList()));









      share|improve this question















      I want to convert my list of optional strings to a list of strings by getting rid of the empty Optionals.



      Is there a shorter version for achieving this than the following code (except statically importing the methods of Collectors)?



      List<Optional<String>> stringsMaybe = Arrays.asList(Optional.of("Hi"),
      Optional.empty(), Optional.of(" there!"));

      List<String> strings = stringsMaybe
      .stream()
      .filter(Optional::isPresent)
      .collect(Collectors.mapping(Optional::get, Collectors.toList()));






      java stream null optional






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited Aug 24 '17 at 16:16









      200_success

      127k15148412




      127k15148412










      asked Oct 30 '15 at 17:37









      Matthias Braun

      4661514




      4661514






















          2 Answers
          2






          active

          oldest

          votes

















          up vote
          24
          down vote



          accepted










          It's more idiomatic to use .map on the stream instead of Collectors.mapping:



          stringsMaybe.stream()
          .filter(Optional::isPresent)
          .map(Optional::get)
          .collect(toList());


          Without introducing a helper method or a custom collector, that's the shortest and clearest way to do this.



          Optional will get a stream method in java 9, so you will be able to do .flatMap(Optional::stream) instead of .filter(...).map(...).






          share|improve this answer




























            up vote
            -1
            down vote













            If you are using rxJava you can do something like:



            Flux<Optional<String>> maybeStrings = Flux.just(
            Optional.of("Hi"),
            Optional.empty(),
            Optional.of(" there!"));

            Flux<String> strings = maybeStrings.handle((maybeString, synchronousSink) ->
            maybeString.ifPresent(synchronousSink::next));





            share|improve this answer










            New contributor




            Doctor Parameter is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
            Check out our Code of Conduct.


















            • Hi, on CodeReview it's expected to explain why your solution offers a better alternative than the current code :)
              – IEatBagels
              2 days ago










            • The only reason you'd want to use my example instead of the selected answer is if you're operating on a rxJava Flux rather than a Java 8 Stream. Technically this does not answer the question but someone searching for this example may benefit from this snippet none the less.
              – Doctor Parameter
              yesterday











            Your Answer





            StackExchange.ifUsing("editor", function () {
            return StackExchange.using("mathjaxEditing", function () {
            StackExchange.MarkdownEditor.creationCallbacks.add(function (editor, postfix) {
            StackExchange.mathjaxEditing.prepareWmdForMathJax(editor, postfix, [["\$", "\$"]]);
            });
            });
            }, "mathjax-editing");

            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: "196"
            };
            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: false,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: null,
            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%2fcodereview.stackexchange.com%2fquestions%2f109294%2ffiltering-out-empty-optionals%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








            up vote
            24
            down vote



            accepted










            It's more idiomatic to use .map on the stream instead of Collectors.mapping:



            stringsMaybe.stream()
            .filter(Optional::isPresent)
            .map(Optional::get)
            .collect(toList());


            Without introducing a helper method or a custom collector, that's the shortest and clearest way to do this.



            Optional will get a stream method in java 9, so you will be able to do .flatMap(Optional::stream) instead of .filter(...).map(...).






            share|improve this answer

























              up vote
              24
              down vote



              accepted










              It's more idiomatic to use .map on the stream instead of Collectors.mapping:



              stringsMaybe.stream()
              .filter(Optional::isPresent)
              .map(Optional::get)
              .collect(toList());


              Without introducing a helper method or a custom collector, that's the shortest and clearest way to do this.



              Optional will get a stream method in java 9, so you will be able to do .flatMap(Optional::stream) instead of .filter(...).map(...).






              share|improve this answer























                up vote
                24
                down vote



                accepted







                up vote
                24
                down vote



                accepted






                It's more idiomatic to use .map on the stream instead of Collectors.mapping:



                stringsMaybe.stream()
                .filter(Optional::isPresent)
                .map(Optional::get)
                .collect(toList());


                Without introducing a helper method or a custom collector, that's the shortest and clearest way to do this.



                Optional will get a stream method in java 9, so you will be able to do .flatMap(Optional::stream) instead of .filter(...).map(...).






                share|improve this answer












                It's more idiomatic to use .map on the stream instead of Collectors.mapping:



                stringsMaybe.stream()
                .filter(Optional::isPresent)
                .map(Optional::get)
                .collect(toList());


                Without introducing a helper method or a custom collector, that's the shortest and clearest way to do this.



                Optional will get a stream method in java 9, so you will be able to do .flatMap(Optional::stream) instead of .filter(...).map(...).







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Oct 30 '15 at 20:58









                Misha

                86457




                86457
























                    up vote
                    -1
                    down vote













                    If you are using rxJava you can do something like:



                    Flux<Optional<String>> maybeStrings = Flux.just(
                    Optional.of("Hi"),
                    Optional.empty(),
                    Optional.of(" there!"));

                    Flux<String> strings = maybeStrings.handle((maybeString, synchronousSink) ->
                    maybeString.ifPresent(synchronousSink::next));





                    share|improve this answer










                    New contributor




                    Doctor Parameter is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                    Check out our Code of Conduct.


















                    • Hi, on CodeReview it's expected to explain why your solution offers a better alternative than the current code :)
                      – IEatBagels
                      2 days ago










                    • The only reason you'd want to use my example instead of the selected answer is if you're operating on a rxJava Flux rather than a Java 8 Stream. Technically this does not answer the question but someone searching for this example may benefit from this snippet none the less.
                      – Doctor Parameter
                      yesterday















                    up vote
                    -1
                    down vote













                    If you are using rxJava you can do something like:



                    Flux<Optional<String>> maybeStrings = Flux.just(
                    Optional.of("Hi"),
                    Optional.empty(),
                    Optional.of(" there!"));

                    Flux<String> strings = maybeStrings.handle((maybeString, synchronousSink) ->
                    maybeString.ifPresent(synchronousSink::next));





                    share|improve this answer










                    New contributor




                    Doctor Parameter is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                    Check out our Code of Conduct.


















                    • Hi, on CodeReview it's expected to explain why your solution offers a better alternative than the current code :)
                      – IEatBagels
                      2 days ago










                    • The only reason you'd want to use my example instead of the selected answer is if you're operating on a rxJava Flux rather than a Java 8 Stream. Technically this does not answer the question but someone searching for this example may benefit from this snippet none the less.
                      – Doctor Parameter
                      yesterday













                    up vote
                    -1
                    down vote










                    up vote
                    -1
                    down vote









                    If you are using rxJava you can do something like:



                    Flux<Optional<String>> maybeStrings = Flux.just(
                    Optional.of("Hi"),
                    Optional.empty(),
                    Optional.of(" there!"));

                    Flux<String> strings = maybeStrings.handle((maybeString, synchronousSink) ->
                    maybeString.ifPresent(synchronousSink::next));





                    share|improve this answer










                    New contributor




                    Doctor Parameter is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                    Check out our Code of Conduct.









                    If you are using rxJava you can do something like:



                    Flux<Optional<String>> maybeStrings = Flux.just(
                    Optional.of("Hi"),
                    Optional.empty(),
                    Optional.of(" there!"));

                    Flux<String> strings = maybeStrings.handle((maybeString, synchronousSink) ->
                    maybeString.ifPresent(synchronousSink::next));






                    share|improve this answer










                    New contributor




                    Doctor Parameter is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                    Check out our Code of Conduct.









                    share|improve this answer



                    share|improve this answer








                    edited 2 days ago





















                    New contributor




                    Doctor Parameter is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                    Check out our Code of Conduct.









                    answered 2 days ago









                    Doctor Parameter

                    992




                    992




                    New contributor




                    Doctor Parameter is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                    Check out our Code of Conduct.





                    New contributor





                    Doctor Parameter is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                    Check out our Code of Conduct.






                    Doctor Parameter is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
                    Check out our Code of Conduct.












                    • Hi, on CodeReview it's expected to explain why your solution offers a better alternative than the current code :)
                      – IEatBagels
                      2 days ago










                    • The only reason you'd want to use my example instead of the selected answer is if you're operating on a rxJava Flux rather than a Java 8 Stream. Technically this does not answer the question but someone searching for this example may benefit from this snippet none the less.
                      – Doctor Parameter
                      yesterday


















                    • Hi, on CodeReview it's expected to explain why your solution offers a better alternative than the current code :)
                      – IEatBagels
                      2 days ago










                    • The only reason you'd want to use my example instead of the selected answer is if you're operating on a rxJava Flux rather than a Java 8 Stream. Technically this does not answer the question but someone searching for this example may benefit from this snippet none the less.
                      – Doctor Parameter
                      yesterday
















                    Hi, on CodeReview it's expected to explain why your solution offers a better alternative than the current code :)
                    – IEatBagels
                    2 days ago




                    Hi, on CodeReview it's expected to explain why your solution offers a better alternative than the current code :)
                    – IEatBagels
                    2 days ago












                    The only reason you'd want to use my example instead of the selected answer is if you're operating on a rxJava Flux rather than a Java 8 Stream. Technically this does not answer the question but someone searching for this example may benefit from this snippet none the less.
                    – Doctor Parameter
                    yesterday




                    The only reason you'd want to use my example instead of the selected answer is if you're operating on a rxJava Flux rather than a Java 8 Stream. Technically this does not answer the question but someone searching for this example may benefit from this snippet none the less.
                    – Doctor Parameter
                    yesterday


















                    draft saved

                    draft discarded




















































                    Thanks for contributing an answer to Code Review Stack Exchange!


                    • 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.


                    Use MathJax to format equations. MathJax reference.


                    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%2fcodereview.stackexchange.com%2fquestions%2f109294%2ffiltering-out-empty-optionals%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

                    Quarter-circle Tiles

                    build a pushdown automaton that recognizes the reverse language of a given pushdown automaton?

                    Mont Emei