Java流庫(kù)詳解(java.util.stream)

Java流庫(kù)(java.util.stream)

流提供了一種讓我們可以在比集合更高的概念級(jí)別上指定計(jì)算的數(shù)據(jù)視圖弧圆。通過(guò)使用流,我們可以說(shuō)明想要完成什么任務(wù)如叼,而不是說(shuō)明如何去實(shí)現(xiàn)它恳邀。(這一點(diǎn)受益于lambda表達(dá)式)我們將操作的調(diào)度留給具體的實(shí)現(xiàn)去解決柬甥。

流大量的用到了lambda表達(dá)式(同根生于Java8)之后的篇幅將會(huì)說(shuō)到lambda表達(dá)式

一、 流的特點(diǎn)

流的特點(diǎn)

  1. 流并不儲(chǔ)存元素羡洁。這些元素可能存儲(chǔ)在底層的集合中玷过,或這是按需生成。
  2. 流的操作不會(huì)修改其數(shù)據(jù)源筑煮。例如辛蚊,filter方法不會(huì)從新的流中移除元素,而是會(huì)生成一個(gè)新的流真仲,其中不包含被過(guò)濾掉的元素袋马。
  3. 流的操作是盡可能惰性執(zhí)行的。這意味著直至需要其結(jié)果時(shí)秸应,操作才會(huì)執(zhí)行虑凛。例如如果我們只想查找前5個(gè)長(zhǎng)單詞(長(zhǎng)度大于x的String)而不是所有長(zhǎng)單詞碑宴,那么filter方法就會(huì)在匹配到第5個(gè)單詞后停止過(guò)濾。因此卧檐,我們甚至可以創(chuàng)建無(wú)限流墓懂。

典型流程

  1. 創(chuàng)建一個(gè)流。
  2. 指定將初始流轉(zhuǎn)換為其他流的中間操作霉囚,可能包含多個(gè)步驟捕仔。
  3. 應(yīng)用終止操作,從而產(chǎn)生結(jié)果盈罐。這個(gè)操作會(huì)強(qiáng)制執(zhí)行之前的惰性操作榜跌。從此之后,這個(gè)流就再也不能用了盅粪。

二钓葫、 流的創(chuàng)建

JavaAPI中有大量方法都可以產(chǎn)生流

API

  1. java.util.Stream<T> 8自身產(chǎn)生流的方法(需要通過(guò)現(xiàn)有流對(duì)象)

    • Stream<T> filter(Predicate<? super T> p)

      產(chǎn)生一個(gè)流,其中包含當(dāng)前流中滿(mǎn)足p的所有元素

      這里的Predicate<? super T> 非常靈性票顾,保證了傳入的p對(duì)象中的boolean test(T t);方法一定能接受流中的每個(gè)元素础浮。因?yàn)楸WC了Predicate<T>中的T是Stream<T>的超類(lèi)。

    • Long count()

      產(chǎn)生當(dāng)前流中元素的數(shù)量奠骄。這是一個(gè)終止操作豆同。(嚴(yán)格上不算創(chuàng)建)

      java.util.Collection 1.2default方法

    • default Stream<E> stream()

    • default Stream<E> parallelStream()

      產(chǎn)生當(dāng)前集合中所有元素的順序流或者并行流。

  2. java.util.Stream 8的一些靜態(tài)方法

    • static <T> Stream<T> of(T... values)

      產(chǎn)生一個(gè)元素為給定值的流含鳞。

    • static <T> Stream<T> empty()

      產(chǎn)生一個(gè)不包含任何元素的流棱诱。

    • static <T> Stream<T> generate(Supplier<T> s)

      產(chǎn)生一個(gè)無(wú)限流皆愉,它的值是通過(guò)反復(fù)調(diào)用函數(shù)s而構(gòu)建的薄湿。

    • static <T> Stream<T> iterate(T seed, UnaryOperator<T> f)

      產(chǎn)生一個(gè)無(wú)限流枝缔,他的元素包含種子、在種子上調(diào)用f產(chǎn)生的值熔吗、在前一個(gè)元素上調(diào)用f產(chǎn)生的值辆床,等等。

  3. java.util.Arrays 1.2的靜態(tài)方法

    • static <T> Stream<T> stream(T[] array, int startInclusive, int endExclusive) 8

      產(chǎn)生一個(gè)流桅狠,他的元素是由數(shù)組中指定范圍內(nèi)的元素構(gòu)成的佛吓。

  4. java.util.regex.Pattern 1.4的靜態(tài)方法

    • Stream<String> splitAsStream(CharSequence input) 8

      產(chǎn)生一個(gè)流,它的元素是輸入中由該模式界定的部分垂攘。

  5. java.nio.file.Files 7

    • static Stream<String> lines(Path path) 8

    • static Stream<String> lines(Path path, Charset cs) 8

      產(chǎn)生一個(gè)流维雇,它的元素是只定文件中的行,該文件的字符集為UTF-8晒他,或者為指定的字符集吱型。

  6. java.util.function.Supplier<T> 8

    • T get()

      提供一個(gè)值。

三陨仅、 filter津滞、map和flatMap方法

流的轉(zhuǎn)換會(huì)產(chǎn)生一個(gè)新的流铝侵,它的元素派生自另一個(gè)流中的元素。

filter:filter轉(zhuǎn)換會(huì)產(chǎn)生一個(gè)流触徐,它的元素與某種條件相匹配咪鲜。filter的引元是Predicate<T> ,即從T到boolean的函數(shù)撞鹉。

map:通常疟丙,我們想要按照某種方式來(lái)轉(zhuǎn)換流中的值,此時(shí)鸟雏,可以使用map方法并傳遞執(zhí)行該轉(zhuǎn)換的函數(shù)享郊。

flatMap:見(jiàn)名之意,這是map方法的變種孝鹊,可以將所有結(jié)果生成(攤平)在一個(gè)流里炊琉。即如果是在map方法中返回Stream<Stream<T>>,可以使用flatMap得到結(jié)果Stream<T>

APIjava.util.stream.Stream 8

  • Stream<T> filter(Predicate<? super T> predicate)

    產(chǎn)生一個(gè)流又活,它包含當(dāng)前流中所有滿(mǎn)足斷言條件的元素苔咪。

  • <R> Stream<R> map (Function<? super T,? extends R> mapper)

    產(chǎn)生一個(gè)流,它包含將mapper應(yīng)用于當(dāng)前流中所有元素產(chǎn)生的結(jié)果柳骄。

    注1:如果返回值是流团赏,則返回流的流(準(zhǔn)確來(lái)說(shuō)返回R就是R的流)

    注2:R和T的意思。R為返回值夹界,所以返回值需要是R的子類(lèi)。T是入?yún)ⅲㄔ蠸tream<T>中的T類(lèi)型)隘世,所以接受參數(shù)需要是T的超類(lèi)

  • <R> Stream<R> flatMap (Function<? super T,? extends Stream<? extends R>> mapper)

    產(chǎn)生一個(gè)流可柿,它是通過(guò)將mapper應(yīng)用于當(dāng)前流中所有元素所產(chǎn)生的結(jié)果連接到一起而獲得的。

    注意:這里的每個(gè)結(jié)果都是一個(gè)流丙者。

四复斥、 抽取子流和連接流

調(diào)用stream.limit(n)會(huì)返回一個(gè)新的流,它在n個(gè)元素之后結(jié)束械媒。(如果原來(lái)的流更短目锭,那么就會(huì)在流結(jié)束時(shí)結(jié)束)。這個(gè)方法對(duì)于裁剪無(wú)限流的尺寸會(huì)顯得特別有用纷捞。

例如:

Stream<Double> stream = Stream.generate(Math::random).limit(100L);
stream.forEach(System.out::println);
調(diào)用stream.skip(n)正好相反:它會(huì)丟棄前n個(gè)元素痢虹。

例如:取前200自然數(shù),然后去掉前100個(gè)

Stream<Integer> stream = Stream.iterate(1, (n)->n+1);
stream = stream.limit(200).skip(100);
stream.forEach(System.out::println);
我們可以用Stream類(lèi)的靜態(tài)方法concat方法將兩個(gè)流連接起來(lái)

例如:

Stream<? extends Object> result = Stream.concat(stream, stream2);
result.forEach(System.out::println);

注意:第一個(gè)流不應(yīng)該是無(wú)限的主儡,否則第二個(gè)流永遠(yuǎn)都不會(huì)得到處理的機(jī)會(huì)奖唯。

API java.util.stream.Stream 8

  • Stream<T> limit(Long maxSize)

    產(chǎn)生一個(gè)流,其中包含了當(dāng)前流中最初的maxSize個(gè)元素糜值。

  • Stream<T> skip(Long n)

    產(chǎn)生一個(gè)流丰捷,它的元素時(shí)當(dāng)前流中除了前n個(gè)元素之外的所有元素坯墨。

  • static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)

    產(chǎn)生一個(gè)流,它的元素時(shí)a的元素后面跟著b的元素病往。

五捣染、 其他的流轉(zhuǎn)換

一、 流的去重停巷,distinct方法耍攘,它的元素是從原有流中產(chǎn)生的,即原來(lái)的元素按照同樣的順序剔除重復(fù)元素后產(chǎn)生的叠穆。這個(gè)流顯然能夠記住它已經(jīng)看到的元素

二少漆、 流的排序,有多種sorted方法的變體可用硼被。其中一種用于操作Comparable元素的流示损,而另一種可以接受一個(gè)Comparator。

三嚷硫、 peek方法检访,peek方法會(huì)產(chǎn)生一個(gè)流,它的元素與原來(lái)流中的元素相同仔掸,但是在每次獲取一個(gè)元素時(shí)脆贵,都會(huì)調(diào)用一個(gè)函數(shù)(你傳入peek的函數(shù)Consumer<T>類(lèi)型)。

API java.util.stream.Stream 8

  • Stream<T> distinct()

    產(chǎn)生一個(gè)流起暮,包含當(dāng)前流中所有不同元素卖氨。

  • Stream<T> sorted()

  • Stream<T> sorted(Comparator<? super T> comparator)

    產(chǎn)生一個(gè)流,它的元素時(shí)當(dāng)前流中的所有元素按照順序排列的负懦。第一個(gè)方法要求元素是實(shí)現(xiàn)了Comparable類(lèi)的實(shí)例筒捺。

  • Stream<T> peek(Comsumer<? super T> action)

    產(chǎn)生一個(gè)流,它與當(dāng)前流中的元素相同纸厉,在獲取其中每個(gè)元素時(shí)系吭,會(huì)見(jiàn)其傳遞給action。

六颗品、 簡(jiǎn)單約簡(jiǎn)(重要)

約簡(jiǎn)是一種終結(jié)操作(terminal operation)肯尺,它們會(huì)將流約簡(jiǎn)為可以在程序中使用的非流值

API java.util.stream.Stream 8

  • Optional<T> max(Comparator<? super T> comparator)

  • Optional<T> min(Comparator<? super T> comparator)

    分別產(chǎn)生這個(gè)流的最大元素和最小元素,使用由給定比較器定義的排序規(guī)則躯枢,如果這個(gè)流為空则吟,會(huì)產(chǎn)生一個(gè)空的Optional對(duì)象。這些操作都是終結(jié)操作锄蹂。

  • Optional<T> findFirst()

  • Optional<T> findFirst()

    分別產(chǎn)生這個(gè)流的第一個(gè)和任意一個(gè)元素逾滥,如果這個(gè)流為空,會(huì)產(chǎn)生一個(gè)空的Optional對(duì)象。這些操作都是中介操作寨昙。

  • boolean anyMatch(Predicate<? super T> predicate)

  • boolean allMatch(Predicate<? super T> predicate)

  • boolean noneMatch(Predicate<? super T> predicate)

    分別在這個(gè)流中任意元素讥巡、所有元素和沒(méi)有任何元素匹配給定斷言時(shí)返回true。這些操作都是終結(jié)操作舔哪。

七欢顷、 收集結(jié)果

API

  1. java.util.stream.BaseStream 8

    • Iterator<T> oteratpr()

      產(chǎn)生一個(gè)獲取當(dāng)前流中的各個(gè)元素的迭代器。這是一種終結(jié)操作捉蚤。

  2. java.util.stream.Stream 8

    • void forEach(Consumer<? super T> action)

      在流的每個(gè)元素上調(diào)用action抬驴。這是一種終結(jié)操作。

    • Object[] toArray()

    • <A> A[] toArray(IntFunction<A[]> generator)

      產(chǎn)生一個(gè)對(duì)象數(shù)組缆巧,或者在將引用A[]::new傳遞給構(gòu)造器時(shí)布持,返回一個(gè)A類(lèi)型的數(shù)組。這些都是終結(jié)操作陕悬。

    • <R,A> R collect(Collector<? super T,A,R> collector)

      使用給定的收集器來(lái)收集當(dāng)前流中的元素题暖。Collectors類(lèi)有用于多種收集齊的工廠(chǎng)方法。例如

      Set<Integer> set = stream.collect(Collectors.toSet());
      TreeSet<Integer> treeSet = stream.collect(Collectors.toCollection(TreeSet::new));
      // 第二種方法可以控制獲得的集的種類(lèi)
      
  3. java.util.stream.Collectors 8

    注:Collectors全部是static方法捉超,建議使用靜態(tài)導(dǎo)入

    • static <T> Collector<T,?,List<T>> toList()

    • static <T> Collector<T,?,Set<T>> toSet()

      產(chǎn)生一個(gè)將元素收集到列表或集中的收集器胧卤。

    • static <T,C extends Collection<T>> Collector<T,?,C> toCollection(Supplier<C> collectionFactory)

      產(chǎn)生一個(gè)將元素收集到任意集合中早的收集器∑丛溃可以傳遞一個(gè)諸如TreeSet::new的構(gòu)造引用枝誊。

    • static Collector<CharSequence,?,String> joining()

    • static Collector<CharSequence,?,String> joining(CharSequence delimiter)

    • static Collector<CharSequence,?,String> joining(CharSequence delimiter,CharSequence prefix,CharSequence suffix)

      產(chǎn)生一個(gè)連接字符串的收集齊。分隔符會(huì)置于字符串之間惜纸,而第一個(gè)字符串之前可以有前綴叶撒,最后一個(gè)字符串之后可以有后綴。如果沒(méi)有指定耐版,那么它們都為空祠够。

    • static <T> Collector<T,?,IntSummaryStatistics> summarizingInt(ToIntFunction<? super T> mapper)

    • static <T> Collector<T,?,LongSummaryStatistics> summarizingInt(ToLongFunction<? super T> mapper)

    • static <T> Collector<T,?,DoubleSummaryStatistics> summarizingInt(ToDoubleFunction<? super T> mapper)

      產(chǎn)生能夠生成(Int|Long|Double)SummaryStatistics對(duì)象的收集齊,通過(guò)它可以獲得將mapper應(yīng)用于每個(gè)元素后產(chǎn)生結(jié)果的個(gè)數(shù)椭更、總和哪审、平均值蛾魄、最大值和最小值虑瀑。例如:

      Stream<Double> stream = Stream.generate(Math::random).limit(100L);
      
      DoubleSummaryStatistics summary = stream.collect(Collectors.summarizingDouble((D)->D*10));
      summary.getAverage();
      summary.getCount();
      summary.getMax();
      summary.getMin();
      summary.getSum();
      
  4. IntSummaryStatistics 8

    LongSummaryStatistics 8

    DoubleSummaryStatistics 8

    • Long getCount()

      產(chǎn)生匯總后的元素個(gè)數(shù)。

    • (int|long|double) getSum()

    • double getAverage()

      產(chǎn)生匯總后元素的總和或平均值滴须,或者在沒(méi)有任何元素時(shí)返回0舌狗。

    • (int|long|double) getMax()

    • (int|long|double) getMin()

      產(chǎn)生匯總后的元素的最大值和最小值,或者在沒(méi)有任何元素時(shí)扔水,產(chǎn)生(Integer|Long|Double).(MAX|MIN)_VALUE痛侍。

八、 收集到映射表中(Map)

API java.util.stream.Collectors 8

  • static<T,K,U,M extends Map<K,U>> Collector<T,?,M> toMap(Function<? supper T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier)

  • static<T,K,U,M extends ConcurrentMap<K,U>> Collector<T,?,M> toConcurrentMap(Function<? supper T,? extends K> keyMapper, Function<? super T,? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier)

    產(chǎn)生一個(gè)收集器,它會(huì)產(chǎn)生一個(gè)映射表(Map)或并發(fā)映射表(ConcurrentMap)主届。keyMapper和valueMapper函數(shù)會(huì)應(yīng)用到每個(gè)收集到的元素上赵哲,從而在所產(chǎn)生的映射表中生成一個(gè)鍵/值項(xiàng)。默認(rèn)情況下君丁,當(dāng)兩個(gè)元素產(chǎn)生相同的鍵時(shí)枫夺,會(huì)拋出一個(gè)IllegalStateException異常。你可以提供一個(gè)mergeFunction來(lái)合并具有相同鍵的值绘闷。默認(rèn)情況下橡庞,其結(jié)果是一個(gè)HashMap或ConcurrentHashMap。你可以提供一個(gè)mapSupplier印蔗,它會(huì)產(chǎn)生所期望的映射表實(shí)例扒最。

    注,最后的兩個(gè)參數(shù)(mergeFunction,mapSupplier)可以沒(méi)有华嘹,API中也提供了沒(méi)有這倆個(gè)參數(shù)的函吧趣。

九、 群組和分區(qū)

API java.util.stream.Collectors 8

  • static <T,K> Collector<T,?,Map<K,List<T>>> groupingBy(Function<? super T,? extends K> classifier)

  • static <T,K> Collector<T,?,ConcurrentMap<K,List<T>>> groupingByConcurrent(Function<? super T,? extends K> classifier)

    產(chǎn)生一個(gè)收集器除呵,它會(huì)產(chǎn)生一個(gè)映射表或并發(fā)映射表再菊,其鍵是將classifier應(yīng)用于所有收集到的元素上所產(chǎn)生的結(jié)果,而值是由具有相同鍵的元素構(gòu)成的一個(gè)個(gè)列表颜曾。

  • static <T> Collector<T,?,Map<Boolean,List<T>>> partitioningBy(Preditcate<? super T> predicate)

    產(chǎn)生一個(gè)收集器纠拔,它會(huì)產(chǎn)生一個(gè)映射表,其鍵是true/false泛豪,而值是由滿(mǎn)足/不滿(mǎn)足斷言的元素構(gòu)成的列表稠诲。

十、 下游收集器

Collectors提供了很多強(qiáng)大的功能诡曙,其中下游收集器可以讓我們輕松(可能吧)地處理下游數(shù)據(jù)(Map<K,V>中的V)

作為下游收集器臀叙,可以直接在groupingBy方法中使用,例如:

Stream<Double> stream = Stream.generate(Math::random).limit(10000L).map((k)->k*10);
Map<Integer, Long> collect = stream.collect(Collectors.groupingBy((k)->{return k.intValue();},Collectors.counting()));
collect.forEach((k,v)->System.out.println("K:"+k+"  V:"+v));

API java.util.stream.Collectors 8

  • static <T> Collector<T,?,Long> counting()

    產(chǎn)生一個(gè)可以對(duì)收集到的元素進(jìn)行計(jì)數(shù)的收集器价卤。

  • static<T> Cikkectir<T,?,Integer> summingInt(ToIntFunction<? super T> mapper)

  • static<T> Cikkectir<T,?,Long> summingLong(ToLongFunction<? super T> mapper)

  • static<T> Cikkectir<T,?,Double> summingDouble(ToIntFunction<? super T> mapper)

    產(chǎn)生一個(gè)收集器劝萤,對(duì)將mapper應(yīng)用到收集到的元素上之后產(chǎn)生的值計(jì)算總和。

    例如:

    Map<Integer, Integer> collect2 = stream.collect(Collectors.groupingBy((k)->{return k.intValue();},Collectors.summingInt((k)->k.intValue())));
    collect2.forEach((k,v)->System.out.println("K:"+k+"   V:"+v));
    // 這將產(chǎn)生以0-9分開(kāi)的10各組慎璧,v為每個(gè)組中所有數(shù)的合
    
  • static <T> Collector<T,?,Optional<T>> maxBy(Comparator<? super T> comparator)

  • static <T> Collector<T,?,Optional<T>> minBy(Comparator<? super T> comparator)

    產(chǎn)生一個(gè)收集器床嫌,使用comparator指定的排序方法,計(jì)算收集到的元素中的最大值和最小值胸私。

  • static <T,U,A,R> Collector<T,?,R> mapping(Function<? super T,? extends U> mapper, Collector<? super U,A,R> downstream)

    產(chǎn)生一個(gè)收集器厌处,它會(huì)產(chǎn)生一個(gè)映射表,其鍵是將mapper應(yīng)用到收集到的數(shù)據(jù)上而產(chǎn)生的岁疼,其值是使用downstream收集器收集到的具有相同鍵的元素阔涉。

十一、 約簡(jiǎn)操作

reduce方法是一種用于從流中計(jì)算某個(gè)值的通用機(jī)制,其最簡(jiǎn)單的形式將接受一個(gè)二元函數(shù)瑰排,并從前兩個(gè)元素開(kāi)始持續(xù)應(yīng)用它贯要。

注意:如果收集操作是并行的,reduce就不是線(xiàn)程安全的椭住,小心使用郭毕。

API java.util.stream.Stream 8

  • Optional<T> reduce(BinaryOperator<T> accumulator)

  • T reduce(T identity, BinaryOperator<T> accumulator)

  • <U> U reduce(U identity,BiFunction<U, ? super T, U> accumulator,BinaryOperator<U> combiner)

    注意:如果reduce是并行流,那么reduce會(huì)產(chǎn)生多個(gè)結(jié)果函荣,需要提供第二個(gè)函數(shù)(組合器)將結(jié)果合并显押。

    用給定的accumulator函數(shù)產(chǎn)生流中元素的積累總和。如果提供了幺元傻挂,那么第一個(gè)被累計(jì)的元素就是該幺元乘碑。如果提供了組合器,那么它可以用來(lái)將分別累計(jì)的各個(gè)部分整合成總和金拒。例如:

    int result = words.reduce(0,(total,word)->total+word.length(), (total1, total2)->total1+total2);
    
  • <R> R collect(Supplier<R> supplier, BiConsumer<R, ? super T> accumulator, BiConsumer<R, R> combiner)

    將元素收集到類(lèi)型R的結(jié)果中兽肤。在每個(gè)部分上,都會(huì)調(diào)用cupplier來(lái)提供初始結(jié)果绪抛,調(diào)用accumulator來(lái)交替的將元素添加到結(jié)果中资铡,并調(diào)用combiner來(lái)整合兩個(gè)結(jié)果。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末幢码,一起剝皮案震驚了整個(gè)濱河市笤休,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌症副,老刑警劉巖店雅,帶你破解...
    沈念sama閱讀 212,383評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異贞铣,居然都是意外死亡闹啦,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)辕坝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)窍奋,“玉大人,你說(shuō)我怎么就攤上這事酱畅×瞻溃” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵圣贸,是天一觀(guān)的道長(zhǎng)挚歧。 經(jīng)常有香客問(wèn)我扛稽,道長(zhǎng)吁峻,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,621評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮用含,結(jié)果婚禮上矮慕,老公的妹妹穿的比我還像新娘。我一直安慰自己啄骇,他們只是感情好痴鳄,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著缸夹,像睡著了一般痪寻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上虽惭,一...
    開(kāi)封第一講書(shū)人閱讀 49,929評(píng)論 1 290
  • 那天橡类,我揣著相機(jī)與錄音,去河邊找鬼芽唇。 笑死顾画,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的匆笤。 我是一名探鬼主播研侣,決...
    沈念sama閱讀 39,076評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼炮捧!你這毒婦竟也來(lái)了庶诡?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,803評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤咆课,失蹤者是張志新(化名)和其女友劉穎灌砖,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體傀蚌,經(jīng)...
    沈念sama閱讀 44,265評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡基显,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了善炫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撩幽。...
    茶點(diǎn)故事閱讀 38,716評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖箩艺,靈堂內(nèi)的尸體忽然破棺而出窜醉,到底是詐尸還是另有隱情,我是刑警寧澤艺谆,帶...
    沈念sama閱讀 34,395評(píng)論 4 333
  • 正文 年R本政府宣布榨惰,位于F島的核電站,受9級(jí)特大地震影響静汤,放射性物質(zhì)發(fā)生泄漏琅催。R本人自食惡果不足惜居凶,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評(píng)論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望藤抡。 院中可真熱鬧侠碧,春花似錦、人聲如沸缠黍。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,798評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)瓷式。三九已至替饿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間贸典,已是汗流浹背盛垦。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,027評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓤漏,地道東北人腾夯。 一個(gè)月前我還...
    沈念sama閱讀 46,488評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蔬充,于是被迫代替她去往敵國(guó)和親蝶俱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理饥漫,服務(wù)發(fā)現(xiàn)榨呆,斷路器,智...
    卡卡羅2017閱讀 134,637評(píng)論 18 139
  • Java8 in action 沒(méi)有共享的可變數(shù)據(jù)庸队,將方法和函數(shù)即代碼傳遞給其他方法的能力就是我們平常所說(shuō)的函數(shù)式...
    鐵牛很鐵閱讀 1,223評(píng)論 1 2
  • /Library/Java/JavaVirtualMachines/jdk-9.jdk/Contents/Home...
    光劍書(shū)架上的書(shū)閱讀 3,868評(píng)論 2 8
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法积蜻,類(lèi)相關(guān)的語(yǔ)法,內(nèi)部類(lèi)的語(yǔ)法彻消,繼承相關(guān)的語(yǔ)法竿拆,異常的語(yǔ)法,線(xiàn)程的語(yǔ)...
    子非魚(yú)_t_閱讀 31,599評(píng)論 18 399
  • 美國(guó)食品藥品監(jiān)督管理局(FDA)于2018年1月9日已批準(zhǔn)將Eisai公司的多重受體酪氨酸激酶抑制劑甲磺酸Lenv...
    亨利福特健康閱讀 960評(píng)論 0 0