How does recursion work in a Java 8 Stream?












13















I have a method like this where I'm using recursion with Streams:



  private static List<Member> convertToFlatList(List<Member> memberList)
{
return memberList.stream().flatMap(i -> Stream.concat(Stream.of(i), convertToFlatList(i.getChildren()).stream())).collect(Collectors.toList());
}


Lets say a Member class has a children list of members that is always initialized to an empty list. Here what I'm doing is converting the hierarchical list of members to a flat list. I understand that part. What I don't understand is how recursion works here.



In recursion, it's terminated when certain conditions are met. But here I'm not giving any condition for terminating intentionally. So how does the termination part work here?










share|improve this question




















  • 3





    Ends once you iterate over all the items in memberList.

    – NGV
    Jan 3 at 7:22
















13















I have a method like this where I'm using recursion with Streams:



  private static List<Member> convertToFlatList(List<Member> memberList)
{
return memberList.stream().flatMap(i -> Stream.concat(Stream.of(i), convertToFlatList(i.getChildren()).stream())).collect(Collectors.toList());
}


Lets say a Member class has a children list of members that is always initialized to an empty list. Here what I'm doing is converting the hierarchical list of members to a flat list. I understand that part. What I don't understand is how recursion works here.



In recursion, it's terminated when certain conditions are met. But here I'm not giving any condition for terminating intentionally. So how does the termination part work here?










share|improve this question




















  • 3





    Ends once you iterate over all the items in memberList.

    – NGV
    Jan 3 at 7:22














13












13








13


3






I have a method like this where I'm using recursion with Streams:



  private static List<Member> convertToFlatList(List<Member> memberList)
{
return memberList.stream().flatMap(i -> Stream.concat(Stream.of(i), convertToFlatList(i.getChildren()).stream())).collect(Collectors.toList());
}


Lets say a Member class has a children list of members that is always initialized to an empty list. Here what I'm doing is converting the hierarchical list of members to a flat list. I understand that part. What I don't understand is how recursion works here.



In recursion, it's terminated when certain conditions are met. But here I'm not giving any condition for terminating intentionally. So how does the termination part work here?










share|improve this question
















I have a method like this where I'm using recursion with Streams:



  private static List<Member> convertToFlatList(List<Member> memberList)
{
return memberList.stream().flatMap(i -> Stream.concat(Stream.of(i), convertToFlatList(i.getChildren()).stream())).collect(Collectors.toList());
}


Lets say a Member class has a children list of members that is always initialized to an empty list. Here what I'm doing is converting the hierarchical list of members to a flat list. I understand that part. What I don't understand is how recursion works here.



In recursion, it's terminated when certain conditions are met. But here I'm not giving any condition for terminating intentionally. So how does the termination part work here?







java recursion java-8 java-stream






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jan 3 at 14:45









Boann

37.2k1290121




37.2k1290121










asked Jan 3 at 7:18









SandSand

1,7192722




1,7192722








  • 3





    Ends once you iterate over all the items in memberList.

    – NGV
    Jan 3 at 7:22














  • 3





    Ends once you iterate over all the items in memberList.

    – NGV
    Jan 3 at 7:22








3




3





Ends once you iterate over all the items in memberList.

– NGV
Jan 3 at 7:22





Ends once you iterate over all the items in memberList.

– NGV
Jan 3 at 7:22












2 Answers
2






active

oldest

votes


















13














The recursion will end when memberList will be empty, since at this case an empty List will be returned.



i.e. when i.getChildren() is an empty List, the recursive call convertToFlatList(i.getChildren()) will receive an empty List, so the Stream pipeline won't make another recursive call (since it has no elements to execute flatMap on), and will return an empty List.






share|improve this answer

































    6














    The termination happens because for the "leafs" that don't have any children,



    Stream.concat(Stream.of(i), convertToFlatList(i.getChildren()).stream())


    will invoke convertToFlatList on an empty list, and applying flatMap() on an empty stream does not invoke the mapping operation.






    share|improve this answer























      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%2f54017926%2fhow-does-recursion-work-in-a-java-8-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









      13














      The recursion will end when memberList will be empty, since at this case an empty List will be returned.



      i.e. when i.getChildren() is an empty List, the recursive call convertToFlatList(i.getChildren()) will receive an empty List, so the Stream pipeline won't make another recursive call (since it has no elements to execute flatMap on), and will return an empty List.






      share|improve this answer






























        13














        The recursion will end when memberList will be empty, since at this case an empty List will be returned.



        i.e. when i.getChildren() is an empty List, the recursive call convertToFlatList(i.getChildren()) will receive an empty List, so the Stream pipeline won't make another recursive call (since it has no elements to execute flatMap on), and will return an empty List.






        share|improve this answer




























          13












          13








          13







          The recursion will end when memberList will be empty, since at this case an empty List will be returned.



          i.e. when i.getChildren() is an empty List, the recursive call convertToFlatList(i.getChildren()) will receive an empty List, so the Stream pipeline won't make another recursive call (since it has no elements to execute flatMap on), and will return an empty List.






          share|improve this answer















          The recursion will end when memberList will be empty, since at this case an empty List will be returned.



          i.e. when i.getChildren() is an empty List, the recursive call convertToFlatList(i.getChildren()) will receive an empty List, so the Stream pipeline won't make another recursive call (since it has no elements to execute flatMap on), and will return an empty List.







          share|improve this answer














          share|improve this answer



          share|improve this answer








          edited Jan 3 at 7:27

























          answered Jan 3 at 7:21









          EranEran

          288k37467557




          288k37467557

























              6














              The termination happens because for the "leafs" that don't have any children,



              Stream.concat(Stream.of(i), convertToFlatList(i.getChildren()).stream())


              will invoke convertToFlatList on an empty list, and applying flatMap() on an empty stream does not invoke the mapping operation.






              share|improve this answer




























                6














                The termination happens because for the "leafs" that don't have any children,



                Stream.concat(Stream.of(i), convertToFlatList(i.getChildren()).stream())


                will invoke convertToFlatList on an empty list, and applying flatMap() on an empty stream does not invoke the mapping operation.






                share|improve this answer


























                  6












                  6








                  6







                  The termination happens because for the "leafs" that don't have any children,



                  Stream.concat(Stream.of(i), convertToFlatList(i.getChildren()).stream())


                  will invoke convertToFlatList on an empty list, and applying flatMap() on an empty stream does not invoke the mapping operation.






                  share|improve this answer













                  The termination happens because for the "leafs" that don't have any children,



                  Stream.concat(Stream.of(i), convertToFlatList(i.getChildren()).stream())


                  will invoke convertToFlatList on an empty list, and applying flatMap() on an empty stream does not invoke the mapping operation.







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Jan 3 at 7:23









                  HulkHulk

                  3,42312042




                  3,42312042






























                      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.




                      draft saved


                      draft discarded














                      StackExchange.ready(
                      function () {
                      StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54017926%2fhow-does-recursion-work-in-a-java-8-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

                      Måne

                      Storängen

                      VLT Carioca