I have a stream of objects and I would like to find the one with a maximal value of some attribute that's expensive to calculate.
As a specific simple example, say that we have a list of strings and we want to find the coolest one, given a coolnessIndex
function.
The following should work:
String coolestString = stringList
.stream()
.max((s1, s2) -> Integer.compare(coolnessIndex(s1), coolnessIndex(s2)))
.orElse(null);
Now, there are two problems with this. First, assuming the coolnessIndex
is expensive to calculate, this probably won't be very efficient. I suppose the max
method will need to use the comparator repeatedly, which in turn will call the coolnessIndex
repeatedly and at the end it will be called more than once for each string.
Second, having to provide the comparator leads to some redundancy in the code. I would much prefer syntax like this:
String coolestString = stringList
.stream()
.maxByAttribute(s -> coolnessIndex(s))
.orElse(null);
However, I haven't been able to find a matching method in the Stream
API. This surprises me, since finding min/max by an attribute seems like a common pattern. I wonder if there's a better way than using the comparator (other than a for loop).
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…