2 回答

TA貢獻1858條經驗 獲得超8個贊
區分調用的Stream#mapToInt(ToIntFunction)
作用和參數ToIntFunction
的作用很重要。
對 的調用
mapToInt
是流將要執行的操作(即將元素映射到)int
。參數
ToIntFunction
是流將如何int
將每個元素映射到.
他們是否可以包含一個將s 隱式解析為s的無參數mapToInt
方法?是的,但看看它的效果如何——這種情況遠不及無參數方法那樣隨意或模棱兩可。String
int
Stream#sorted()
mapToInt
無參數sorted
方法假定元素是Comparable
Java 中一個基本的、標準化的和廣泛使用的接口——任何類都可以實現該接口(而只有一個類可以是 )String
。因此,雖然該方法不是類型安全的,但可以說用例足夠普遍以證明其存在的合理性。
mapToInt
但是,假設元素為String
s 并將其內容解析為 an 的無參數方法int
是一個高度特定的用例。為什么這樣一個通用的 API 會提供這樣一個特定的操作?這將是一個完全武斷的決定,沒有合理的理由。例如,為什么不將每個映射String
到它的length
呢?為什么要String
特別處理而不是其他類型?因此,該方法接受一個ToIntFunction
參數,該參數描述如何int
根據具體情況將元素映射到。
注意到Integer::parseInt
是一個方法引用可能會有所幫助,它是普通lambda 表達式的簡寫。兩者都是功能接口的實現,比使用匿名類更簡潔。換句話說,您正在創建一個新ToIntFunction
實例并將其作為參數傳遞。
以下所有內容在功能上都是等效的:
// method reference
stream.mapToInt(Integer::parseInt)
// lambda expression
stream.mapToInt((String value) -> Integer.parseInt(value)) // explicit parameter types
stream.mapToInt(value -> Integer.parseInt(value)) // implicit parameter types
// anonymous class
stream.mapToInt(new ToIntFunction<>() {
@Override
public int applyAsInt(String value) {
return Integer.parseInt(value);
}
})
哪里stream是一個Stream<String>。

TA貢獻1828條經驗 獲得超13個贊
你正在做的操作是這樣的:
Stream.of("a1", "a2", "a3") //step1 .map(s -> s.substring(1)) //step2 .mapToInt(Integer::parseInt) //step3 .max()
您定義了一個字符串流(在第 1 步中),然后您將它們中的每一個丟棄掉上面的 1 個字符,留下“1”、“2”和“3”流,(第 2 步)但請注意,它們仍然是字符串對象...然后將其轉換為整數,因此您需要為“mapToInt”提供一個以字符串作為參數并返回整數的“函數”(第 3 步)
這是在 Integer 類中定義的:
https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#parseInt(java.lang.String)
您當然可以編寫并傳遞自己的函數……但是為什么要重新發明輪子呢?:)
添加回答
舉報