2 回答

TA貢獻(xiàn)1858條經(jīng)驗 獲得超8個贊
區(qū)分調(diào)用的Stream#mapToInt(ToIntFunction)
作用和參數(shù)ToIntFunction
的作用很重要。
對 的調(diào)用
mapToInt
是流將要執(zhí)行的操作(即將元素映射到)int
。參數(shù)
ToIntFunction
是流將如何int
將每個元素映射到.
他們是否可以包含一個將s 隱式解析為s的無參數(shù)mapToInt
方法?是的,但看看它的效果如何——這種情況遠(yuǎn)不及無參數(shù)方法那樣隨意或模棱兩可。String
int
Stream#sorted()
mapToInt
無參數(shù)sorted
方法假定元素是Comparable
Java 中一個基本的、標(biāo)準(zhǔn)化的和廣泛使用的接口——任何類都可以實(shí)現(xiàn)該接口(而只有一個類可以是 )String
。因此,雖然該方法不是類型安全的,但可以說用例足夠普遍以證明其存在的合理性。
mapToInt
但是,假設(shè)元素為String
s 并將其內(nèi)容解析為 an 的無參數(shù)方法int
是一個高度特定的用例。為什么這樣一個通用的 API 會提供這樣一個特定的操作?這將是一個完全武斷的決定,沒有合理的理由。例如,為什么不將每個映射String
到它的length
呢?為什么要String
特別處理而不是其他類型?因此,該方法接受一個ToIntFunction
參數(shù),該參數(shù)描述如何int
根據(jù)具體情況將元素映射到。
注意到Integer::parseInt
是一個方法引用可能會有所幫助,它是普通lambda 表達(dá)式的簡寫。兩者都是功能接口的實(shí)現(xiàn),比使用匿名類更簡潔。換句話說,您正在創(chuàng)建一個新ToIntFunction
實(shí)例并將其作為參數(shù)傳遞。
以下所有內(nèi)容在功能上都是等效的:
// 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貢獻(xiàn)1828條經(jīng)驗 獲得超13個贊
你正在做的操作是這樣的:
Stream.of("a1", "a2", "a3") //step1 .map(s -> s.substring(1)) //step2 .mapToInt(Integer::parseInt) //step3 .max()
您定義了一個字符串流(在第 1 步中),然后您將它們中的每一個丟棄掉上面的 1 個字符,留下“1”、“2”和“3”流,(第 2 步)但請注意,它們?nèi)匀皇亲址畬ο?..然后將其轉(zhuǎn)換為整數(shù),因此您需要為“mapToInt”提供一個以字符串作為參數(shù)并返回整數(shù)的“函數(shù)”(第 3 步)
這是在 Integer 類中定義的:
https://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#parseInt(java.lang.String)
您當(dāng)然可以編寫并傳遞自己的函數(shù)……但是為什么要重新發(fā)明輪子呢?:)
添加回答
舉報