user2410266
user2410266

Reputation: 551

ArrayList to Stream in Java by grouping

I would like to get the highest score group by Id .If two highest score's are same then i would like get the highest score based on lowest Optional ID.I would like to get it in Java Stream.So far this code works.Is there any efficient way to rewrite this code in java stream

Example :

records=record.Person(batchNumber);
List<Person> highestRecords = new ArrayList<>();for(
Person s:records)
  {
if(!highestRecords.isEmpty()) {
    boolean contains = false;
    for(Person ns: new ArrayList<>(highestRecords)) {
        if(s.Id().compareTo(ns.Id()) == 0) {
            contains = true;
            if(s.getScore.compareTo(ns.getScore()) > 0     
    && s.optionalId().compareTo(ns.optionalId()) < 0) {

                highestRecords.remove(ns);
                highestRecords.add(s)       
            }
        }
    }
    if(contains == false) {
        highestRecords.add(s);
    }
}else {
    highestRecords.add(s);
}
  }
}

Upvotes: 0

Views: 147

Answers (1)

Makoto
Makoto

Reputation: 106430

Don't convert this to a stream.

There is no one pure operation happening here. There are several.

Of note is the initial operation:

if(getNewPendingMatches.size() > 0) 

That's always going to be false on the first iteration and you're always going to add one element in.

On subsequent iterations, life gets weird because now you're trying to remove elements while iterating over them. A stream cannot delete values from itself while iterating over itself; it only ever processes in one direction.

As written this code should not be converted to a stream. You won't gain any benefits in doing so, and you're going to actively harm readability if you do.

Upvotes: 3

Related Questions