How does recursion work in a Java 8 Stream?












9














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
    22 hours ago
















9














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
    22 hours ago














9












9








9


2





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 15 hours ago









Boann

36.7k1287121




36.7k1287121










asked 22 hours ago









Sand

1,293214




1,293214








  • 3




    Ends once you iterate over all the items in memberList.
    – NGV
    22 hours ago














  • 3




    Ends once you iterate over all the items in memberList.
    – NGV
    22 hours ago








3




3




Ends once you iterate over all the items in memberList.
– NGV
22 hours ago




Ends once you iterate over all the items in memberList.
– NGV
22 hours ago












2 Answers
2






active

oldest

votes


















9














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































    3














    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









      9














      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




























        9














        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


























          9












          9








          9






          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 22 hours ago

























          answered 22 hours ago









          Eran

          280k37452538




          280k37452538

























              3














              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


























                3














                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
























                  3












                  3








                  3






                  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 22 hours ago









                  Hulk

                  2,89311938




                  2,89311938






























                      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%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

                      1300-talet

                      1300-talet

                      Display a custom attribute below product name in the front-end Magento 1.9.3.8