string拆分为int_拆分为流
string拆分為int
我正在為我工??作的公司準(zhǔn)備正則表達(dá)式教程更新。 原始教程創(chuàng)建于2012年,從那時(shí)起Java發(fā)生了一點(diǎn)變化。 有新的Java語(yǔ)言版本,盡管Java中的正則表達(dá)式處理仍不完善(nb。它仍使用非確定性FSA),但仍有一些新功能。 我在上一篇文章中針對(duì)新的Java 9方法寫(xiě)過(guò)一些文章。 但是這一次,我必須查看自2012年以來(lái)的所有新功能。
從1.8開(kāi)始的splitAsStream
這樣,我在java.util.regex.Pattern類(lèi)中找到了splitAsStream 。 它與方法split幾乎相同,除了返回的不是String對(duì)象的數(shù)組而是流。 最簡(jiǎn)單的實(shí)現(xiàn)是
public Stream<String> splitAsStream(final CharSequence input) {return Arrays.stream(p.split(input)); }當(dāng)圖書(shū)館試圖跟上新風(fēng)和支持潮流時(shí),我可以看到許多這樣的實(shí)現(xiàn)。 沒(méi)有什么比將數(shù)組或列表從某些現(xiàn)有功能轉(zhuǎn)換為流更簡(jiǎn)單了。
但是,解決方案是低于標(biāo)準(zhǔn),失去了流的本質(zhì):僅執(zhí)行所需的工作。 我的意思是,“應(yīng)僅在處理流時(shí)執(zhí)行所需的工作”,而不是在開(kāi)發(fā)人員將數(shù)組或集合返回方法轉(zhuǎn)換為返回一個(gè)流的情況下進(jìn)行。 流以一種精簡(jiǎn)的方式及時(shí)交付結(jié)果。 您會(huì)看到我們有多少個(gè)懶惰的表情。
JDK實(shí)現(xiàn)利用了流的性能優(yōu)勢(shì)。 如果您查看源代碼,您會(huì)立即看到實(shí)現(xiàn)比前面提到的簡(jiǎn)單解決方案稍微復(fù)雜一些。 由于我沒(méi)有時(shí)間去研究實(shí)現(xiàn),也許沒(méi)有興趣,所以我使用了另一種方法來(lái)證明實(shí)現(xiàn)尊重流的惰性。
該方法的參數(shù)是CharSequence而不是String 。 CharSequence是String實(shí)現(xiàn)的接口,但我們也可以實(shí)現(xiàn)它。 為了感覺(jué)到這種情況下的流實(shí)現(xiàn)多么懶惰,我創(chuàng)建了一個(gè)CharSequence實(shí)現(xiàn),它通過(guò)調(diào)試打印出了方法調(diào)用。
class MyCharSequence implements CharSequence {private String me;MyCharSequence(String me) {this.me = me;}@Overridepublic int length() {System.out.println("MCS.length()=" + me.length());return me.length();}@Overridepublic char charAt(int index) {System.out.println("MCS.charAt(" + index + ")=" + me.charAt(index));return me.charAt(index);}@Overridepublic CharSequence subSequence(int start, int end) {System.out.println("MCS.subSequence(" + start + "," + end + ")="+ me.subSequence(start, end));return me.subSequence(start, end);} }有了此類(lèi),我可以執(zhí)行以下簡(jiǎn)單的main方法:
public static void main(String[] args) {Pattern p = Pattern.compile("[,\\.\\-;]");final CharSequence splitIt =new MyCharSequence("one.two-three,four;five;");p.splitAsStream(splitIt).forEach(System.out::println); }輸出顯示該實(shí)現(xiàn)確實(shí)很懶:
MCS.length()=24 MCS.length()=24 MCS.length()=24 MCS.charAt(0)=o MCS.charAt(1)=n MCS.charAt(2)=e MCS.charAt(3)=. MCS.subSequence(0,3)=one one MCS.length()=24 MCS.charAt(4)=t MCS.charAt(5)=w MCS.charAt(6)=o MCS.charAt(7)=- MCS.subSequence(4,7)=two two MCS.length()=24 MCS.charAt(8)=t MCS.charAt(9)=h MCS.charAt(10)=r MCS.charAt(11)=e MCS.charAt(12)=e MCS.charAt(13)=, MCS.subSequence(8,13)=three three MCS.length()=24 MCS.charAt(14)=f MCS.charAt(15)=o MCS.charAt(16)=u MCS.charAt(17)=r MCS.charAt(18)=; MCS.subSequence(14,18)=four four MCS.length()=24 MCS.charAt(19)=f MCS.charAt(20)=i MCS.charAt(21)=v MCS.charAt(22)=e MCS.charAt(23)=; MCS.subSequence(19,23)=five five MCS.length()=24實(shí)現(xiàn)繼續(xù)進(jìn)行,當(dāng)它找到流的第一個(gè)元素時(shí),將其返回。 我們可以處理字符串“ one”,并且僅當(dāng)我們返回其他元素時(shí),它才能處理其他字符。 為什么必須在開(kāi)始時(shí)調(diào)用方法長(zhǎng)度3次? 我不知道。 也許它想非常確定序列的長(zhǎng)度不會(huì)發(fā)生神奇的變化。
士氣
這是一個(gè)很好的示例,說(shuō)明如何擴(kuò)展庫(kù)以支持流。 如果應(yīng)用程序只是將集合或數(shù)組轉(zhuǎn)換為第一個(gè)版本中的流,這不是問(wèn)題,但是如果分析表明性能可以收回投資,則應(yīng)實(shí)現(xiàn)真正的流惰性。
邊注
CharSequence的實(shí)現(xiàn)是可變的,但是處理要求它保持恒定,否則結(jié)果不確定。 我可以確認(rèn)。
下周,我將展示splitAsStream的可能用法,該splitAsStream利用的功能是它在字符序列中讀取的內(nèi)容不會(huì)超出所需的范圍。
翻譯自: https://www.javacodegeeks.com/2017/11/split-as-stream.html
string拆分為int
總結(jié)
以上是生活随笔為你收集整理的string拆分为int_拆分为流的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: javaee概览_Java 9概览
- 下一篇: 生查子怎么读 生查子的简介