Back to Intellij Community

SimplifyStreamApiCallChains

java/java-impl/resources/inspectionDescriptions/SimplifyStreamApiCallChains.html

2025.3-rc-22.1 KB
Original Source

Reports stream API call chains that can be simplified. Simplification will often avoid some temporary object creation during collection traversal.

The inspection replaces the following call chains:

  • collection.stream().forEach()collection.forEach()
  • collection.stream().collect(toList/toSet/toCollection())new CollectionType<>(collection)
  • collection.stream().toArray()collection.toArray()
  • Arrays.asList().stream()Arrays.stream() or Stream.of()
  • IntStream.range(0, array.length).mapToObj(idx -> array[idx])Arrays.stream(array)
  • IntStream.range(0, list.size()).mapToObj(idx -> list.get(idx))list.stream()
  • Collections.singleton().stream()Stream.of()
  • Collections.emptyList().stream()Stream.empty()
  • stream.filter().findFirst().isPresent()stream.anyMatch()
  • stream.collect(counting())stream.count()
  • stream.collect(maxBy())stream.max()
  • stream.collect(mapping())stream.map().collect()
  • stream.collect(reducing())stream.reduce()
  • stream.collect(summingInt())stream.mapToInt().sum()
  • stream.mapToObj(x -> x)stream.boxed()
  • stream.map(x -> {...; return x;})stream.peek(x -> ...)
  • !stream.anyMatch()stream.noneMatch()
  • !stream.anyMatch(x -> !(...))stream.allMatch()
  • stream.map().anyMatch(Boolean::booleanValue)stream.anyMatch()
  • IntStream.range(expr1, expr2).mapToObj(x -> array[x])Arrays.stream(array, expr1, expr2)
  • Collection.nCopies(count, ...)Stream.generate().limit(count)
  • stream.sorted(comparator).findFirst()Stream.min(comparator)
  • optional.orElseGet(() -> { throw new ...; })optional.orElseThrow()

Note that the replacement semantics may have minor differences in some cases. For example, Collections.synchronizedList(...).stream().forEach() is not synchronized while Collections.synchronizedList(...).forEach() is synchronized. Also, collect(Collectors.maxBy()) returns an empty Optional if the resulting element is null while Stream.max() throws NullPointerException in this case.