rspec/rules/S6204/java/rule.adoc
Fred Tingaud 16f6c0aecf
Inline adoc when include has no additional value (#1940)
Inline adoc files when they are included exactly once.

Also fix language tags because this inlining gives us better information
on what language the code is written in.
2023-05-25 14:18:12 +02:00

51 lines
1.9 KiB
Plaintext

== Why is this an issue?
In Java 8 ``++Streams++`` were introduced to support chaining of operations over collections in a functional style. The most common way to save a result of such chains is to save them to some collection (usually ``++List++``). To do so there is a terminal method ``++collect++`` that can be used with a library of ``++Collectors++``. The key problem is that ``++.collect(Collectors.toList())++`` actually returns a mutable kind of ``++List++`` while in the majority of cases unmodifiable lists are preferred. In Java 10 a new collector appeared to return an unmodifiable list: ``++toUnmodifiableList()++``. This does the trick but results in verbose code. Since Java 16 there is now a better variant to produce an unmodifiable list directly from a stream: ``++Stream.toList()++``.
This rule raises an issue when "collect" is used to create a list from a stream.
=== Noncompliant code example
[source,java]
----
List<String> list1 = Stream.of("A", "B", "C")
.collect(Collectors.toList()); // Noncompliant
List<String> list2 = Stream.of("A", "B", "C")
.collect(Collectors.toUnmodifiableList()); // Noncompliant
----
=== Compliant solution
[source,java]
----
List<String> list1 = Stream.of("A", "B", "C").toList(); // Compliant
List<String> list2 = Stream.of("A", "B", "C")
.collect(Collectors.toList()); // Compliant, the list2 needs to be mutable
list2.add("X");
----
ifdef::env-github,rspecator-view[]
'''
== Implementation Specification
(visible only on this page)
=== Message
Replace this usage of 'Stream.collect(Collectors.toList)' or 'Stream.collect(Collectors.toUnmodifiableList())' with 'Stream.toList()'
=== Highlighting
invocation of ``++collect(Collectors.toList())++`` or ``++collect(Collectors.toUnmodifiableList())++``
endif::env-github,rspecator-view[]