问题
Consider Below 2 examples.
1 With Streams
myList.stream().map(this::getInt).max(Integer::compareTo);
2 Old way
int max = Integer.MIN_VALUE;
for (MyItem item : myList) {
max = Math.max(max, getInt(item));
}
Above getInt
method accepts a MyItem
argument and returns an int
result.
Here, #2 gives me a much lower latency compared to #1. Does anyone have an idea why or anything going wrong for me?
回答1:
myList.stream().mapToInt(this::getInt).max()
Try mapping to an IntStream. An IntStream
works with int
s internally, which avoids the overhead of boxing and unboxing Integer
objects. Also, IntStream.max() doesn't need a custom comparator.
So you suggest that the prominent reason is 'boxing' and 'unboxing'?
Without running it through your benchmark I don't know if it'll match the for
loop's performance. But it'll be an improvement. If it's not good enough then I suggest sticking with the loop as I don't see any other way to improve it.
回答2:
You should probably take advantage of features of Streams, that should optimise these cases. Read the docs for Streams, the first example shows the optimised path for IntStream.
https://docs.oracle.com/javase/8/docs/api/java/util/stream/Stream.html
int max = myList.stream()
.mapToInt(this::getInt)
.max()
.orElse(Integer.MIN_VALUE);
来源:https://stackoverflow.com/questions/61619407/java-streams-max-and-min-lag-in-performance