I would like to get the max value out of a list using java 8 stream methods.
The structure is the following:
I read a csv file and store the data of every line in a separate object of type Round.
all these Round objects are stored in an ArrayList called arrRound
all Round objects have a field: List hits
a Hit consists of 2 fields: int numberOfGames and int prizeAmount
public class Round{
private List hits;
}
public class Hits{
private int numberOfGames;
private int prizeAmount;
}
What I would like to do is to iterate over all elements of arrRound, get their hits field's getPrizeAmount() method and get the max out of it.
I started as the following but can't seem to do it:
public class Main(){
public void main(String[]args){
List arrRound = getRoundFromCSV();
int maxPrize = arrRound.stream()
.forEach(round -> {
round.getHits()
.forEach(hit -> hit.getPrizeAmount());
});
}
}
and I am not able to call max() on the end of the statement.
Thank you for your help in advance!
解决方案
You can achieve it by this way :
iterate over the Round of the list
change from Round object to its List hits,
use flatMap to go from Stream> to Stream
change from Hits to its prizeAmount field
get the max if exists
if no max (like if list empty or else) return -1
So a solution using Method reference
int maxPrize = arrRoundarrRound.stream() // Stream
.map(Round::getHits) // Stream>
.flatMap(List::stream) // Stream
.mapToInt(Hit::getPrizeAmount) // IntStream
.max() // OptionalInt
.orElse(-1); // int
With class lambda and map + flatMap in one :
int maxPrize = arrRoundarrRound.stream()
.flatMap(round -> round.getHits().stream())
.mapToInt(hits -> hits.getPrizeAmount())
.max()
.orElse(-1);