将Stream转换为IntStream

Hil*_*kus 28 java java-8 java-stream

我有一种感觉,我在这里遗漏了一些东西.我发现自己做了以下事情

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

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

有没有更好的转换方式?这一切都是为了避免使用max()Stream,这需要传递一个Comparator但问题是专门对的皈依StreamIntStream

Hol*_*ger 11

由于类型擦除,Stream实现不了解其元素的类型,也不能为您提供简化max操作或转换为IntStream方法.

在这两种情况下,它分别需要一个函数a Comparator或a ToIntFunction来使用Stream元素的未知引用类型来执行操作.

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

return countMap.values().stream().max(Comparator.naturalOrder()).get();
Run Code Online (Sandbox Code Playgroud)

鉴于自然顺序比较器被实现为单例.所以它是唯一的比较器,如果有任何优化,它提供了被Stream实现识别的机会Comparable元素进行.如果没有这样的优化,由于其单独特性,它仍然是具有最低内存占用的变体.

如果你坚持这样的一个转换StreamIntStream没有办法周围设置ToIntFunction并有一个没有预定义的单Number::intValue一种功能,因此使用Integer::intValue已经是最好的选择.您可以i->i改为编写,这样更短但只是隐藏了拆箱操作.


Tod*_*odd 10

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

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

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

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

  • 也许,`orElse(0)`或`orElseThrow(...)`可能"更安全",而不是完成`get()` (2认同)

Ale*_*lex 7

另一种可以进行转换的方法是使用lambda : mapToInt(i -> i). 这里将详细讨论您是否应该使用lambda或方法引用,但总结是您应该使用您认为更具可读性的任何一个.