将流转换为 IntStream

2022-09-01 06:07:23

我有一种感觉,我在这里错过了一些东西。我发现自己在做以下事情

private static int getHighestValue(Map<Character, Integer> countMap) {
    return countMap.values().stream().mapToInt(Integer::intValue).max().getAsInt();
}

我的问题是通过从到的愚蠢转换StreamIntStreammapToInt(Integer::intValue)

有没有更好的转换方法?所有这些都是为了避免使用 from ,这需要传递一个,但问题具体是关于转换为max()StreamComparatorStreamIntStream


答案 1

由于类型擦除,实现不了解其元素的类型,并且无法为您提供简化操作或转换为方法。StreammaxIntStream

在这两种情况下,它都需要一个函数,分别是 a 或 a,来使用 的未知引用类型来执行运算。ComparatorToIntFunctionStream

要执行的操作的最简单形式是

return countMap.values().stream().max(Comparator.naturalOrder()).get();

鉴于自然顺序比较器作为单例实现的事实。因此,它是唯一一个在元素方面进行任何优化提供被实现识别的机会的比较器。如果没有这样的优化,由于其单例性质,它仍将是内存占用量最低的变体。StreamComparable

如果你坚持做一个转换到一个,没有办法提供一个,并且没有预定义的单例用于一种函数,所以使用已经是最好的选择。您可以改为编写,这更短,但只是隐藏了拆箱操作。StreamIntStreamToIntFunctionNumber::intValueInteger::intValuei->i


答案 2

我意识到您正在尝试避免比较器,但是您可以通过参考以下内容来使用内置功能:Integer.compareTo

private static int getHighestValue(Map<Character, Integer> countMap) {
    return countMap.values().stream().max(Integer::compareTo).get();
}

或者按照@fge建议,使用:::compare

private static int getHighestValue(Map<Character, Integer> countMap) {
    return countMap.values().stream().max(Integer::compare).get();
}

推荐