Is flatMap guaranteed to be lazy? [duplicate]

Under the current implementation, flatmap is eager; like any other stateful intermediate operation (like sorted and distinct). And it’s very easy to prove :

 int result = Stream.of(1)
            .flatMap(x -> Stream.generate(() -> ThreadLocalRandom.current().nextInt()))


This never finishes as flatMap is computed eagerly. For your example:
    .flatMap(url -> fetchDataFromInternet(url).stream())

It means that for each url, the flatMap will block all others operation that come after it, even if you care about a single one. So let’s suppose that from a single url your fetchDataFromInternet(url) generates 10_000 lines, well your findFirst will have to wait for all 10_000 to be computed, even if you care about only one.


This is fixed in Java 10, where we get our laziness back: see JDK-8075939


This is fixed in Java 8 too (8u222): JDK-8225328

Leave a Comment