# Replace Stream Collect By ToList

# Description

Java 16 introduced Stream.toList() (opens new window) as a shorthand method for converting a Stream into an unmodifiable List.
This rule replaces invocations of collect(Collectors.toUnmodifiableList()) on streams by invocations of the new method stream.toList(). In case Collectors.toList() is used as a collector, the rule makes additional verifications whether the generated list is modified by the context or not. In the latter case, invocations of collect(Collectors.toList()) on streams are also replaced by invocations of toList().

Thus the code is simplified and readability is improved.

Requirements

  • Java 16

# Benefits

Removes code clutter. Improves readability.

# Tags

# Code Changes

# Using Collectors.toUnmodifiableList()

Pre

List<String> List = collection
		.stream()
		.map(function)
		.filter(predicate)
		.collect(Collectors.toUnmodifiableList());

Post

List<String> List = collection
		.stream()
		.map(function)
		.filter(predicate)
		.toList();

# Argument of Collections.unmodifiableList(...)

Pre

return Collections.unmodifiableList(collection
		.stream()
		.map(function)
		.filter(predicate)
		.collect(Collectors.toList()));

Post

return Collections.unmodifiableList(collection
		.stream()
		.map(function)
		.filter(predicate)
		.toList());

# Using Collectors.toList()

Pre

void sendMails(List<User>users) {
	List<String> emails = users.stream()
		.map(User::getMail)
		.collect(Collectors.toList());
	for (String email : emails) {
		validate(email);
		send(email);
	}
}

Post

void sendMails(List<User>users) {
	List<String> emails = users.stream()
		.map(User::getMail)
		.toList();
	for (String email : emails) {
		validate(email);
		send(email);
	}
}

# Argument of Collections.min(...)

Pre

int min = Collections.min(collection
		.stream()
		.map(function)
		.filter(predicate)
		.collect(Collectors.toList()));

Post

int min = Collections.min(collection
		.stream()
		.map(function)
		.filter(predicate)
		.toList());

# Argument of List.copyOf(...)

Pre

return List.copyOf(collection
		.stream()
		.map(function)
		.filter(predicate)
		.collect(Collectors.toList()));

Post

return List.copyOf(collection
		.stream()
		.map(function)
		.filter(predicate)
		.toList());

# Argument of list.addAll(...)

Pre

list.addAll(collection
		.stream()
		.map(function)
		.filter(predicate)
		.collect(Collectors.toList()));

Post

list.addAll(collection
		.stream()
		.map(function)
		.filter(predicate)
		.toList());

# Enhanced For Loop with Stream.collect(...)

Pre

for (String s : collection
		.stream()
		.map(function)
		.filter(predicate)
		.collect(Collectors.toList())) {
	//...
}

Post

for (String s : collection
		.stream()
		.map(function)
		.filter(predicate)
		.toList()) {
	//...
}

🛠️ Auto-refactor Available

You can auto-refactor this with jSparrow.
Drop this button to your Eclipse IDE workspace to install jSparrow for free:

Drag to your running Eclipse* workspace. *Requires Eclipse Marketplace Client

Need help? Check out our installation guide.

# Properties

Property Value
Rule ID ReplaceStreamCollectByToList
First seen in jSparrow version 4.4.0
Minimum Java version 16
Remediation cost 2 min