Java基礎(chǔ)系列-Collector和Collectors


原創(chuàng)文章闷串,轉(zhuǎn)載請(qǐng)標(biāo)注出處:《Java基礎(chǔ)系列-Collector和Collectors》


一瓮钥、概述

Collector是專門用來作為Stream的collect方法的參數(shù)的。

public interface Stream<T> extends BaseStream<T, Stream<T>> {
    <R, A> R collect(Collector<? super T, A, R> collector);
}

而Collectors是作為生產(chǎn)具體Collector的工具類烹吵。

二碉熄、Collector

Collector主要包含五個(gè)參數(shù),它的行為也是由這五個(gè)參數(shù)來定義的肋拔,如下所示:

public interface Collector<T, A, R> {
    // supplier參數(shù)用于生成結(jié)果容器锈津,容器類型為A
    Supplier<A> supplier();
    // accumulator用于消費(fèi)元素,也就是歸納元素凉蜂,這里的T就是元素琼梆,它會(huì)將流中的元素一個(gè)一個(gè)與結(jié)果容器A發(fā)生操作
    BiConsumer<A, T> accumulator();
    // combiner用于兩個(gè)兩個(gè)合并并行執(zhí)行的線程的執(zhí)行結(jié)果,將其合并為一個(gè)最終結(jié)果A
    BinaryOperator<A> combiner();
    // finisher用于將之前整合完的結(jié)果R轉(zhuǎn)換成為A
    Function<A, R> finisher();
    // characteristics表示當(dāng)前Collector的特征值窿吩,這是個(gè)不可變Set
    Set<Characteristics> characteristics();
}

Collector擁有兩個(gè)of方法用于生成Collector實(shí)例茎杂,其中一個(gè)擁有上面所有五個(gè)參數(shù),另一個(gè)四個(gè)參數(shù)纫雁,不包括finisher煌往。

public interface Collector<T, A, R> {
    // 四參方法,用于生成一個(gè)Collector轧邪,T代表流中的一個(gè)一個(gè)元素刽脖,R代表最終的結(jié)果
    public static<T, R> Collector<T, R, R> of(Supplier<R> supplier,
                                              BiConsumer<R, T> accumulator,
                                              BinaryOperator<R> combiner,
                                              Characteristics... characteristics) {/*...*/}
    // 五參方法,用于生成一個(gè)Collector忌愚,T代表流中的一個(gè)一個(gè)元素曲管,A代表中間結(jié)果,R代表最終結(jié)果硕糊,finisher用于將A轉(zhuǎn)換為R                                          
    public static<T, A, R> Collector<T, A, R> of(Supplier<A> supplier,
                                                 BiConsumer<A, T> accumulator,
                                                 BinaryOperator<A> combiner,
                                                 Function<A, R> finisher,
                                                 Characteristics... characteristics) {/*...*/}                                              
}

Characteristics:這個(gè)特征值是一個(gè)枚舉院水,擁有三個(gè)值:CONCURRENT(多線程并行),UNORDERED(無序)癌幕,IDENTITY_FINISH(無需轉(zhuǎn)換結(jié)果)衙耕。其中四參of方法中沒有finisher參數(shù),所以必有IDENTITY_FINISH特征值勺远。

三橙喘、Collectors

Collectors是一個(gè)工具類,是JDK預(yù)實(shí)現(xiàn)Collector的工具類胶逢,它內(nèi)部提供了多種Collector厅瞎,我們可以直接拿來使用饰潜,非常方便。

5.6.1 toCollection

將流中的元素全部放置到一個(gè)集合中返回和簸,這里使用Collection彭雾,泛指多種集合。

public class CollectorsTest {
    public static void toCollectionTest(List<String> list) {
        List<String> ll = list.stream().collect(Collectors.toCollection(LinkedList::new));
    }
    public static void main(String[] args) {
        List<String> list = Arrays.asList("123","456","789","1101","212121121","asdaa","3e3e3e","2321eew");
        toCollectionTest(list);
    }
}

5.6.2 toList

將流中的元素放置到一個(gè)列表集合中去锁保。這個(gè)列表默認(rèn)為ArrayList薯酝。

public class CollectorsTest {
    public static void toListTest(List<String> list) {
        List<String> ll = list.stream().collect(Collectors.toList());
    }
    public static void main(String[] args) {
        List<String> list = Arrays.asList("123","456","789","1101","212121121","asdaa","3e3e3e","2321eew");
        toListTest(list);
    }
}

5.6.3 toSet

將流中的元素放置到一個(gè)無序集set中去。默認(rèn)為HashSet爽柒。

public class CollectorsTest {
    public static void toSetTest(List<String> list) {
        Set<String> ss = list.stream().collect(Collectors.toSet());
    }
    public static void main(String[] args) {
        List<String> list = Arrays.asList("123","456","789","1101","212121121","asdaa","3e3e3e","2321eew");
        toSetTest(list);
    }
}

5.6.4 joining

joining的目的是將流中的元素全部以字符序列的方式連接到一起吴菠,可以指定連接符,甚至是結(jié)果的前后綴浩村。

public class CollectorsTest {
    public static void joiningTest(List<String> list){
        // 無參方法
        String s = list.stream().collect(Collectors.joining());
        System.out.println(s);
        // 指定連接符
        String ss = list.stream().collect(Collectors.joining("-"));
        System.out.println(ss);
        // 指定連接符和前后綴
        String sss = list.stream().collect(Collectors.joining("-","S","E"));
        System.out.println(sss);
    }
    public static void main(String[] args) {
        List<String> list = Arrays.asList("123","456","789","1101","212121121","asdaa","3e3e3e","2321eew");
        joiningTest(list);
    }
}

執(zhí)行結(jié)果:

1234567891101212121121asdaa3e3e3e2321eew
123-456-789-1101-212121121-asdaa-3e3e3e-2321eew
S123-456-789-1101-212121121-asdaa-3e3e3e-2321eewE

StringJoiner:這是一個(gè)字符串連接器做葵,可以定義連接符和前后綴,正好適用于實(shí)現(xiàn)第三種joining方法心墅。

5.6.5 mapping

這個(gè)映射是首先對(duì)流中的每個(gè)元素進(jìn)行映射酿矢,即類型轉(zhuǎn)換,然后再將新元素以給定的Collector進(jìn)行歸納怎燥。

public class CollectorsTest {
    public static void mapingTest(List<String> list){
        List<Integer> ll = list.stream().limit(5).collect(Collectors.mapping(Integer::valueOf,Collectors.toList()));
    }
    public static void main(String[] args) {
        List<String> list = Arrays.asList("123","456","789","1101","212121121","asdaa","3e3e3e","2321eew");
        mapingTest(list);
    }
}

實(shí)例中截取字符串列表的前5個(gè)元素瘫筐,將其分別轉(zhuǎn)換為Integer類型,然后放到一個(gè)List中返回铐姚。

5.6.6 collectingAndThen

該方法是在歸納動(dòng)作結(jié)束之后严肪,對(duì)歸納的結(jié)果進(jìn)行再處理。

public class CollectorsTest {
    public static void collectingAndThenTest(List<String> list){
        int length = list.stream().collect(Collectors.collectingAndThen(Collectors.toList(),e -> e.size()));
        System.out.println(length);
    }
    public static void main(String[] args) {
        List<String> list = Arrays.asList("123","456","789","1101","212121121","asdaa","3e3e3e","2321eew");
        collectingAndThenTest(list);
    }
}

執(zhí)行結(jié)果為:

8

5.6.7 counting

該方法用于計(jì)數(shù)谦屑。

public class CollectorsTest {
    public static void countingTest(List<String> list){
        long size = list.stream().collect(Collectors.counting());
        System.out.println(size);
    }
    public static void main(String[] args) {
        List<String> list = Arrays.asList("123","456","789","1101","212121121","asdaa","3e3e3e","2321eew");
        countingTest(list);
    }
}

結(jié)果:

8

5.6.8 minBy/maxBy

生成一個(gè)用于獲取最小/最大值的Optional結(jié)果的Collector。

public class CollectorsTest {
    public static void maxByAndMinByTest(List<String> list){
        System.out.println(list.stream().collect(Collectors.maxBy((a,b) -> a.length()-b.length())));
        System.out.println(list.stream().collect(Collectors.minBy((a,b) -> a.length()-b.length())));
    }
    public static void main(String[] args) {
        List<String> list = Arrays.asList("123","456","789","1101","212121121","asdaa","3e3e3e","2321eew");
        maxByAndMinByTest(list);
    }
}

執(zhí)行結(jié)果為:

Optional[212121121]
Optional[123]

5.6.9 summingInt/summingLong/summingDouble

生成一個(gè)用于求元素和的Collector篇梭,首先通過給定的mapper將元素轉(zhuǎn)換類型氢橙,然后再求和。

參數(shù)的作用就是將元素轉(zhuǎn)換為指定的類型恬偷,最后結(jié)果與轉(zhuǎn)換后類型一致悍手。

public class CollectorsTest {
    public static void summingTest(List<String> list){
        int i = list.stream().limit(3).collect(Collectors.summingInt(Integer::valueOf));
        long l = list.stream().limit(3).collect(Collectors.summingLong(Long::valueOf));
        double d = list.stream().limit(3).collect(Collectors.summingDouble(Double::valueOf));
        System.out.println(i +"\n" +l + "\n" + d);
    }
    public static void main(String[] args) {
        List<String> list = Arrays.asList("123","456","789","1101","212121121","asdaa","3e3e3e","2321eew");
        summingTest(list);
    }
}

執(zhí)行結(jié)果為:

1368
1368
1368.0

5.6.10 averagingInt/averagingLong/averagingDouble

生成一個(gè)用于求元素平均值的Collector,首選通過參數(shù)將元素轉(zhuǎn)換為指定的類型袍患。

參數(shù)的作用就是將元素轉(zhuǎn)換為指定的類型坦康,求平均值涉及到除法操作,結(jié)果一律為Double類型诡延。

public class CollectorsTest {
    public static void averagingTest(List<String> list){
        double i = list.stream().limit(3).collect(Collectors.averagingInt(Integer::valueOf));
        double l = list.stream().limit(3).collect(Collectors.averagingLong(Long::valueOf));
        double d = list.stream().limit(3).collect(Collectors.averagingDouble(Double::valueOf));
        System.out.println(i +"\n" +l + "\n" + d);
    }
    public static void main(String[] args) {
        List<String> list = Arrays.asList("123","456","789","1101","212121121","asdaa","3e3e3e","2321eew");
        averagingTest(list);
    }
}

執(zhí)行結(jié)果為:

456.0
456.0
456.0

5.6.11 reducing

reducing方法有三個(gè)重載方法滞欠,其實(shí)是和Stream里的三個(gè)reduce方法對(duì)應(yīng)的,二者是可以替換使用的肆良,作用完全一致筛璧,也是對(duì)流中的元素做統(tǒng)計(jì)歸納作用逸绎。

public final class Collectors {
    // 無初始值的情況,返回一個(gè)可以生成Optional結(jié)果的Collector
    public static <T> Collector<T, ?, Optional<T>> reducing(BinaryOperator<T> op) {/*...*/}
    // 有初始值的情況夭谤,返回一個(gè)可以直接產(chǎn)生結(jié)果的Collector
    public static <T> Collector<T, ?, T> reducing(T identity, BinaryOperator<T> op) {/*...*/}
    // 有初始值棺牧,還有針對(duì)元素的處理方案mapper,生成一個(gè)可以直接產(chǎn)生結(jié)果的Collector朗儒,元素在執(zhí)行結(jié)果操作op之前需要先執(zhí)行mapper進(jìn)行元素轉(zhuǎn)換操作
    public static <T, U> Collector<T, ?, U> reducing(U identity,
                                    Function<? super T, ? extends U> mapper,
                                    BinaryOperator<U> op) {/*...*/}
}

實(shí)例:

public class CollectorsTest {
    public static void reducingTest(List<String> list){
        System.out.println(list.stream().limit(4).map(String::length).collect(Collectors.reducing(Integer::sum)));
        System.out.println(list.stream().limit(3).map(String::length).collect(Collectors.reducing(0, Integer::sum)));
        System.out.println(list.stream().limit(4).collect(Collectors.reducing(0,String::length,Integer::sum)));
    }
    public static void main(String[] args) {
        List<String> list = Arrays.asList("123","456","789","1101","212121121","asdaa","3e3e3e","2321eew");
        reducingTest(list);
    }
}
Optional[13]
9
13

效果可參見Java流式操作系列-Stream

5.6.12 groupingBy

這個(gè)方法是用于生成一個(gè)擁有分組功能的Collector颊乘,它也有三個(gè)重載方法:

public final class Collectors {
    // 只需一個(gè)分組參數(shù)classifier,內(nèi)部自動(dòng)將結(jié)果保存到一個(gè)map中醉锄,每個(gè)map的鍵為?類型(即classifier的結(jié)果類型)乏悄,值為一個(gè)list,這個(gè)list中保存在屬于這個(gè)組的元素榆鼠。
    public static <T, K> Collector<T, ?, Map<K, List<T>>> groupingBy(
            Function<? super T, ? extends K> classifier) {/*...*/}
    // 在上面方法的基礎(chǔ)上增加了對(duì)流中元素的處理方式的Collector纲爸,比如上面的默認(rèn)的處理方法就是Collectors.toList()
    public static <T, K, A, D>Collector<T, ?, Map<K, D>> groupingBy(
            Function<? super T, ? extends K> classifier,Collector<? super T, A, D> downstream) {/*...*/}
    // 在第二個(gè)方法的基礎(chǔ)上再添加了結(jié)果Map的生成方法。
    public static <T, K, D, A, M extends Map<K, D>>
        Collector<T, ?, M> groupingBy(Function<? super T, ? extends K> classifier,
                                      Supplier<M> mapFactory,
                                      Collector<? super T, A, D> downstream) {/*...*/}
}

實(shí)例:

public class CollectorsTest {
    public static void groupingByTest(List<String> list){
        Map<Integer,List<String>> s = list.stream().collect(Collectors.groupingBy(String::length));
        Map<Integer,List<String>> ss = list.stream().collect(Collectors.groupingBy(String::length, Collectors.toList()));
        Map<Integer,Set<String>> sss = list.stream().collect(Collectors.groupingBy(String::length,HashMap::new,Collectors.toSet()));
        System.out.println(s.toString() + "\n" + ss.toString() + "\n" + sss.toString());
    }
    public static void main(String[] args) {
        List<String> list = Arrays.asList("123","456","789","1101","212121121","asdaa","3e3e3e","2321eew");
        groupingByTest(list);
    }
}

執(zhí)行結(jié)果為:

{3=[123, 456, 789], 4=[1101], 5=[asdaa], 6=[3e3e3e], 7=[2321eew], 9=[212121121]}
{3=[123, 456, 789], 4=[1101], 5=[asdaa], 6=[3e3e3e], 7=[2321eew], 9=[212121121]}
{3=[123, 456, 789], 4=[1101], 5=[asdaa], 6=[3e3e3e], 7=[2321eew], 9=[212121121]}

groupingBy方法還有并發(fā)版的groupingByConcurrent妆够,功能基本一致识啦,只是返回的Collector是并行的。

5.6.13 partitioningBy

該方法將流中的元素按照給定的校驗(yàn)規(guī)則的結(jié)果分為兩個(gè)部分神妹,放到一個(gè)map中返回颓哮,map的鍵是Boolean類型,值為元素的列表List鸵荠。

該方法有兩個(gè)重載方法:

public final class Collectors {
    // 只需一個(gè)校驗(yàn)參數(shù)predicate
    public static <T>
        Collector<T, ?, Map<Boolean, List<T>>> partitioningBy(Predicate<? super T> predicate) {/*...*/}
    // 在上面方法的基礎(chǔ)上增加了對(duì)流中元素的處理方式的Collector冕茅,比如上面的默認(rèn)的處理方法就是Collectors.toList()
    public static <T, D, A>
        Collector<T, ?, Map<Boolean, D>> partitioningBy(Predicate<? super T> predicate,
                                                        Collector<? super T, A, D> downstream) {/*...*/}
}

實(shí)例:

public class CollectorsTest {
    public static void partitioningByTest(List<String> list){
        Map<Boolean,List<String>> map = list.stream().collect(Collectors.partitioningBy(e -> e.length()>5));
        Map<Boolean,Set<String>> map2 = list.stream().collect(Collectors.partitioningBy(e -> e.length()>6,Collectors.toSet()));
        System.out.println(map.toString() + "\n" + map2.toString());
    }
    public static void main(String[] args) {
        List<String> list = Arrays.asList("123","456","789","1101","212121121","asdaa","3e3e3e","2321eew");
        partitioningByTest(list);
    }
}

執(zhí)行結(jié)果:

{false=[123, 456, 789, 1101, asdaa], true=[212121121, 3e3e3e, 2321eew]}
{false=[123, 456, 1101, 789, 3e3e3e, asdaa], true=[212121121, 2321eew]}

5.6.14 toMap

toMap方法是根據(jù)給定的鍵生成器和值生成器生成的鍵和值保存到一個(gè)map中返回,鍵和值的生成都依賴于元素蛹找,可以指定出現(xiàn)重復(fù)鍵時(shí)的處理方案和保存結(jié)果的map姨伤。

public final class Collectors {
    // 指定鍵和值的生成方式keyMapper和valueMapper
    public static <T, K, U>
        Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
                                        Function<? super T, ? extends U> valueMapper) {/*...*/}
    // 在上面方法的基礎(chǔ)上增加了對(duì)鍵發(fā)生重復(fù)時(shí)處理方式的mergeFunction,比如上面的默認(rèn)的處理方法就是拋出異常
    public static <T, K, U>
        Collector<T, ?, Map<K,U>> toMap(Function<? super T, ? extends K> keyMapper,
                                        Function<? super T, ? extends U> valueMapper,
                                        BinaryOperator<U> mergeFunction) {/*...*/}
    // 在第二個(gè)方法的基礎(chǔ)上再添加了結(jié)果Map的生成方法庸疾。
    public static <T, K, U, M extends Map<K, U>>
        Collector<T, ?, M> toMap(Function<? super T, ? extends K> keyMapper,
                                    Function<? super T, ? extends U> valueMapper,
                                    BinaryOperator<U> mergeFunction,
                                    Supplier<M> mapSupplier) {/*...*/}
}

實(shí)例:

public class CollectorsTest {
    public static void toMapTest(List<String> list){
        Map<String,String> map = list.stream().limit(3).collect(Collectors.toMap(e -> e.substring(0,1),e -> e));
        Map<String,String> map1 = list.stream().collect(Collectors.toMap(e -> e.substring(0,1),e->e,(a,b)-> b));
        Map<String,String> map2 = list.stream().collect(Collectors.toMap(e -> e.substring(0,1),e->e,(a,b)-> b,HashMap::new));
        System.out.println(map.toString() + "\n" + map1.toString() + "\n" + map2.toString());
    }
    public static void main(String[] args) {
        List<String> list = Arrays.asList("123","456","789","1101","212121121","asdaa","3e3e3e","2321eew");
        toMapTest(list);
    }
}

執(zhí)行結(jié)果:

{1=123, 4=456, 7=789}
{a=asdaa, 1=1101, 2=2321eew, 3=3e3e3e, 4=456, 7=789}
{a=asdaa, 1=1101, 2=2321eew, 3=3e3e3e, 4=456, 7=789}

第一種方式中乍楚,如果不添加limit限制,就會(huì)拋出異常届慈。

還有并發(fā)的版本:toConcurrentMap,同樣三種重載方法徒溪,與toMap基本一致,只是它最后使用的map是并發(fā)Map:ConcurrentHashMap金顿。

5.6.15 summarizingInt/summarizingLong/summarizingDouble

這三個(gè)方法適用于匯總的臊泌,返回值分別是IntSummaryStatistics,LongSummaryStatistics揍拆,DoubleSummaryStatistics渠概。

在這些返回值中包含有流中元素的指定結(jié)果的數(shù)量、和嫂拴、最大值高氮、最小值慧妄、平均值。所有僅僅針對(duì)數(shù)值結(jié)果剪芍。

public class CollectorsTest {
    public static void summarizingTest(List<String> list){
        IntSummaryStatistics intSummary = list.stream().collect(Collectors.summarizingInt(String::length));
        LongSummaryStatistics longSummary = list.stream().limit(4).collect(Collectors.summarizingLong(Long::valueOf));
        DoubleSummaryStatistics doubleSummary = list.stream().limit(3).collect(Collectors.summarizingDouble(Double::valueOf));
        System.out.println(intSummary.toString() + "\n" + longSummary.toString() + "\n" + doubleSummary.toString());
    }
    public static void main(String[] args) {
        List<String> list = Arrays.asList("123","456","789","1101","212121121","asdaa","3e3e3e","2321eew");
        summarizingTest(list);
    }
}

執(zhí)行結(jié)果:

IntSummaryStatistics{count=8, sum=40, min=3, average=5.000000, max=9}
LongSummaryStatistics{count=4, sum=2469, min=123, average=617.250000, max=1101}
DoubleSummaryStatistics{count=3, sum=1368.000000, min=123.000000, average=456.000000, max=789.000000}

最后我們可以從返回的匯總實(shí)例中獲取到想要的匯總結(jié)果塞淹。

四、總結(jié)

整個(gè)Collectors工具類就是在為Collector服務(wù)罪裹,用于創(chuàng)建各種不同的Collector饱普。部分功能與Stream中的方法重合了,為了簡化代碼状共,完全不必采用Collectors實(shí)現(xiàn)套耕,優(yōu)先Stream方法。

參考:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末峡继,一起剝皮案震驚了整個(gè)濱河市冯袍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌碾牌,老刑警劉巖康愤,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異舶吗,居然都是意外死亡征冷,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門誓琼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來检激,“玉大人,你說我怎么就攤上這事腹侣∈迨眨” “怎么了?”我有些...
    開封第一講書人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵傲隶,是天一觀的道長暇仲。 經(jīng)常有香客問我窿冯,道長虐唠,這世上最難降的妖魔是什么贷痪? 我笑而不...
    開封第一講書人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任腮出,我火速辦了婚禮帖鸦,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘胚嘲。我一直安慰自己作儿,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開白布馋劈。 她就那樣靜靜地躺著攻锰,像睡著了一般晾嘶。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上娶吞,一...
    開封第一講書人閱讀 51,155評(píng)論 1 299
  • 那天垒迂,我揣著相機(jī)與錄音,去河邊找鬼妒蛇。 笑死机断,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绣夺。 我是一名探鬼主播吏奸,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼陶耍!你這毒婦竟也來了奋蔚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤烈钞,失蹤者是張志新(化名)和其女友劉穎泊碑,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棵磷,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蛾狗,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了仪媒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片沉桌。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖算吩,靈堂內(nèi)的尸體忽然破棺而出留凭,到底是詐尸還是另有隱情,我是刑警寧澤偎巢,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布蔼夜,位于F島的核電站,受9級(jí)特大地震影響压昼,放射性物質(zhì)發(fā)生泄漏求冷。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一窍霞、第九天 我趴在偏房一處隱蔽的房頂上張望匠题。 院中可真熱鬧,春花似錦但金、人聲如沸韭山。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽钱磅。三九已至梦裂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間盖淡,已是汗流浹背年柠。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留禁舷,地道東北人彪杉。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像牵咙,于是被迫代替她去往敵國和親派近。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353