# Replace For-Loop with Stream::takeWhile
# Description
The Stream API in Java 9 is extended with the takeWhile (opens new window) method to get the prefix of a stream.
This rule replaces the enhanced for-loops iterating over the prefix of a collection with Stream::takeWhile.
Requirements
Java 9
# Benefits
Applying this rule results in better readability and more compact code.
# Tags
# Code Changes
# Iterating over a List
 Pre
List<User> users = findAllSorted();
for(User user : users) {
    if(!isImportantCustomer(user)) {
        break;
    }
    attachDiscount(user);
}
Post
List<User> users = findAllSorted();
users.stream()
    .takeWhile(user -> isImportantCustomer(user))
    .forEach(user -> applyDiscount(user));
# Iterating over a Map
 Pre
Map<Integer, User> users = findAllSorted();
for(Map.Entry<Integer, User> entry : users.entrySet()) {
    if(!isEarlyCustomerId(entry.getKey())) {
        break;
    }
    User user = entry.getValue();
    attachDiscount(user);
}
Post
Map<Integer, User> users = findAllSorted();
users.entrySet()
    .stream()
    .takeWhile(entry -> isEarlyCustomerId(entry.getKey()))
    .forEach(entry -> {
        User user = entry.getValue();
        attachDiscount(user);
    });
🛠️ Auto-refactor Available
You can auto-refactor this with jSparrow. 
 Drop this button to your Eclipse IDE workspace to install jSparrow for free: 
Need help? Check out our installation guide.
# Properties
| Property | Value | 
|---|---|
| Rule ID | EnhancedForLoopToStreamTakeWhile | 
| First seen in jSparrow version | 3.7.0 | 
| Minimum Java version | 9 | 
| Remediation cost | 2 min | 
