3 回答

TA貢獻1860條經(jīng)驗 獲得超9個贊
簡單地說:不要。
不要投,也不要把事情搞得太復雜。
而是尋找安全的方法從count()
. 初學者請看這里:
int bar = Math.toIntExact(someLong);
例如。當您 100% 確定計算出的值總是適合 int 時,您只需避免放下可能拋出的 ArithmeticException 的捕獲。而且你仍然有一種感覺,你不能在沒有注意到的情況下“超越”。
但正如所說:不要將時間/精力投入到專門計算您自己的東西上,當您可以使用內(nèi)置功能來計算事物并將它們轉(zhuǎn)換為 int/Integer 時。請記?。耗斎氪a的每個字符都需要稍后閱讀和理解。因此,隨著時間的推移,即使是“20 個字符”也會增加。所以當你總是傾向于更短的解決方案時,只要它們易于閱讀/理解。

TA貢獻1798條經(jīng)驗 獲得超7個贊
這是正確的方法。轉(zhuǎn)換所有的不同的值,以1
使用Stream::mapToInt
-它產(chǎn)生IntStream
具有sum
/count
能的情況下直接映射來處理數(shù)值的方法流:
Integer count = s.filter(e -> (e.length() >= lb && e.length() <= ub && !e.contains(" "))) .map(String::toUpperCase) .distinct() .mapToInt(i -> 1) .sum();
無需映射到int
,您可以使用Stream::reduce(U identity, BiFunction<U,? super T,U> accumulator, BinaryOperator<U> combiner)
來獲得完全相同的結(jié)果:
Integer count = s.filter(e -> (e.length() >= 2 && e.length() <= 10 && !e.contains(" "))) .map(String::toUpperCase) .distinct() .reduce(0, (a,b) -> a + 1, (a,b) -> a + b);
這個方法的接口有點復雜:
U identity
設置為 0 - 開始計數(shù)accumulator
((a,b) -> a + 1
) 將字符串轉(zhuǎn)換為int
,每個字符串將被轉(zhuǎn)換為 1 并添加到前一個結(jié)果 (0+1+1+1...)。combiner
組合兩個連續(xù)值 ((a,b) -> a + b
) -值的總和,1
實際上是計數(shù)。

TA貢獻1845條經(jīng)驗 獲得超8個贊
如果您想在不使用內(nèi)置 .count() 方法的情況下計算流中的元素,那么您可以將每個元素映射到一個 int 并通過對它們求和來減少。像這樣的東西:
Integer count = s.mapToInt(i -> 1).reduce((a, b) -> a + b).orElse(0);
或者正如@Holger 在下面評論的那樣在映射后使用 sum() 。
Integer count = s.mapToInt(i -> 1).sum();
添加回答
舉報