# java:S3958 inconsistent handling of stream::iterator and equivalent lambda expression

**URL:** <https://community.sonarsource.com/t/java-s3958-inconsistent-handling-of-stream-iterator-and-equivalent-lambda-expression/182032>\
**Category:** SonarQube Server / Community Build\
**Tags:** java\
**Created:** [May 6, 2026, 2:06am UTC](https://community.sonarsource.com/t/java-s3958-inconsistent-handling-of-stream-iterator-and-equivalent-lambda-expression/182032 "2026-05-06T02:06:13Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Emilyaxe](https://dub1.discourse-cdn.com/sonarsource/user_avatar/community.sonarsource.com/emilyaxe/32/76074_2.png) [@Emilyaxe](https://community.sonarsource.com/u/Emilyaxe)\
**Post date:** [May 6, 2026, 2:06am UTC](https://community.sonarsource.com/t/java-s3958-inconsistent-handling-of-stream-iterator-and-equivalent-lambda-expression/182032/1 "2026-05-06T02:06:13Z")

</div>

**Product:** SonarQube Community 26.4.0.121862  
**sonar-java version:** sonar-java 8.28.0.43176  
**sonar-java SE version:** sonar-java-symbolic-execution 8.16.3.1589  
**Java source level:** 21 (javac 21, source/target 17)

### Rule

`java:S3958` — “Stream” operations should not be ignored

### Description

S3958 handles `stream::iterator` and the equivalent lambda `() -> stream.iterator()` inconsistently. Both forms consume the stream through the enhanced `for` loop inside the callee, but SonarJava reports S3958 only for the lambda form and not for the method reference.

### Reproducer

```java
package demo;

import java.util.List;
import java.util.stream.Stream;

public class StreamConsumptionCheck {

    // BEFORE — no S3958 raised
    boolean barRef(List<Boolean> list) {
        Stream<Boolean> filter = list.stream().filter(Boolean::booleanValue);
        return foo(filter::iterator);
    }

    // AFTER — S3958 raised ("Refactor the code so this stream pipeline is used.")
    boolean barLambda(List<Boolean> list) {
        Stream<Boolean> filter = list.stream().filter(Boolean::booleanValue);
        return foo(() -> filter.iterator());
    }

    boolean foo(Iterable<Boolean> iterable) {
        int count = 0;
        for (Boolean b : iterable) {
            if (b) count++;
        }
        return count > 0;
    }
}

```

###

---

<div class="post-metadata">

**Author:** ![Leonardo\_Pilastri](https://dub1.discourse-cdn.com/sonarsource/user_avatar/community.sonarsource.com/leonardo_pilastri/32/38853_2.png) [@Leonardo\_Pilastri](https://community.sonarsource.com/u/Leonardo_Pilastri)\
**Post date:** [May 12, 2026, 7:34am UTC](https://community.sonarsource.com/t/java-s3958-inconsistent-handling-of-stream-iterator-and-equivalent-lambda-expression/182032/4 "2026-05-12T07:34:09Z")

</div>

Thanks for the report, I validated the issue and created [a ticket](https://sonarsource.atlassian.net/browse/SONARJAVA-6370) to fix it.
