Java8學(xué)習(xí)--Stream&Collectors

java8關(guān)于stream操作api總結(jié):

一岗喉、先介紹幾個(gè)名詞:

1坯癣、中間操作:

中間操作會(huì)產(chǎn)生另一個(gè)流哼勇。因此中間操作可以用來(lái)創(chuàng)建執(zhí)行一系列動(dòng)作的管道都伪。一個(gè)特別需要注意的點(diǎn)是:中間操作不是立即發(fā)生的。相反积担,當(dāng)在中間操作創(chuàng)建的新流上執(zhí)行完終端操作后陨晶,中間操作指定的操作才會(huì)發(fā)生

2、終止操作:

會(huì)消費(fèi)流帝璧,這種操作會(huì)產(chǎn)生一個(gè)結(jié)果的先誉,如果一個(gè)流被消費(fèi)過(guò)了湿刽,那它就不能被重用的。

3褐耳、"中間操作"的狀態(tài):

(1)無(wú)狀態(tài)操作:在處理流中的每個(gè)元素時(shí)诈闺,與其他元素?zé)o關(guān)

(2)有狀態(tài)操作:在處理流中的每個(gè)元素時(shí),依賴其他元素(eg:min铃芦,max之類的)

4雅镊、縮減操作:

把一個(gè)流經(jīng)過(guò)一個(gè)操作,輸出一個(gè)值杨帽。eg:min、max嗤军,或者典型的reduce操作

5注盈、for&forEach:

我們?cè)谠L問(wèn)一個(gè)數(shù)組元素的時(shí)候,最快的方式肯定是通過(guò)索引去訪問(wèn)的吧叙赚,而for循環(huán)遍歷的時(shí)候就是通過(guò)下標(biāo)進(jìn)行的老客,所以效率那是相當(dāng)?shù)母撸钱?dāng)我們的數(shù)據(jù)結(jié)構(gòu)不是數(shù)組的時(shí)候震叮,比如是鏈表的時(shí)候胧砰,可想而知,for循環(huán)的效率是有多低苇瓣,但是forEach底層采用的是迭代器的方式尉间,他對(duì)數(shù)據(jù)結(jié)構(gòu)是沒(méi)有要求的,不管上層的數(shù)據(jù)結(jié)構(gòu)是什么击罪,他都能保證高效地執(zhí)行哲嘲!因此我的最終答案:如果數(shù)據(jù)結(jié)構(gòu)是ArrayList這種數(shù)據(jù)結(jié)構(gòu),那你可以采用for媳禁,但是你的數(shù)據(jù)結(jié)構(gòu)如果是LinkList那你千萬(wàn)別再用for,應(yīng)該果斷采用forEach眠副。

6、并行流:

調(diào)用parallel()就可以獲取到一個(gè)并行流了竣稽,幫助我們多線程操作囱怕,提高效。需要注意的是毫别,服務(wù)器需要多核支持

for循環(huán),stream操作,并行stream操作的性能對(duì)比:

并行stream > for > stream : 數(shù)據(jù)量不大或者核數(shù)不夠多的情況下娃弓,for比并行stream效率高

二、各種api:

1岛宦、中間操作——篩選
方法 描述
filter(Predicate p) 接收 Lambda 忘闻, 從流中排除某些元素。
distinct() 篩選恋博,通過(guò)流所生成元素的 hashCode() 和 equals() 去除重復(fù)元素
limit(long maxSize) 截?cái)嗔髌爰眩蛊湓夭怀^(guò)給定數(shù)量私恬。
skip(long n) 跳過(guò)元素,返回一個(gè)扔掉了前 n 個(gè)元素的流炼吴。若流中元素不足 n 個(gè)本鸣,則返回一個(gè)空流。與 limit(n) 互補(bǔ)
2硅蹦、中間操作——映射
方法 描述
map(Function f) 接收一個(gè)函數(shù)作為參數(shù)荣德,該函數(shù)會(huì)被應(yīng)用到每個(gè)元素上,并將其映射成一個(gè)新的元素童芹。
mapToDouble(ToDoubleFunction ) 接收一個(gè)函數(shù)作為參數(shù)涮瞻,該函數(shù)會(huì)被應(yīng)用到每個(gè)元素上,產(chǎn)生一個(gè)新的 DoubleStream假褪。
mapToInt(ToIntFunction ) 接收一個(gè)函數(shù)作為參數(shù)署咽,該函數(shù)會(huì)被應(yīng)用到每個(gè)元素上,產(chǎn)生一個(gè)新的 IntStream生音。
mapToLong(ToLongFunction ) 接收一個(gè)函數(shù)作為參數(shù)宁否,該函數(shù)會(huì)被應(yīng)用到每個(gè)元素上,產(chǎn)生一個(gè)新的 LongStream缀遍。
flatMap(Function f) 接收一個(gè)函數(shù)作為參數(shù)慕匠,將流中的每個(gè)值都換成另一個(gè)流,然后把所有流連接成一個(gè)流
3域醇、中間操作——排序
方法 描述
sorted() 產(chǎn)生一個(gè)新流台谊,其中按自然順序排序
sorted(Comparator comp) 產(chǎn)生一個(gè)新流,其中按比較器順序排序
4譬挚、終止操作——查找與匹配
方法 描述
allMatch(Predicate p) 檢查是否匹配所有元素
anyMatch(Predicate ) 檢查是否至少匹配一個(gè)元素
noneMatch(Predicate p) 檢查是否沒(méi)有匹配所有元素
findFirst() 返回第一個(gè)元素
findAny() 返回當(dāng)前流中的任意元素
count() 返回流中元素總數(shù)
max(Comparator c) 返回流中最大值
min(Comparator c) 返回流中最小值
forEach(Consumer c) stream API 使用內(nèi)部迭代(默認(rèn)做了外部迭代)
5青伤、終止操作——?dú)w約
方法 描述
reduce(T identity, BinaryOperator b) 可以將流中元素反復(fù)結(jié)合起來(lái),得到一個(gè)值殴瘦。返回 T狠角。<br />在第一個(gè)版本當(dāng)中,identity是這樣一個(gè)值蚪腋,對(duì)于涉及identity和流中任意的累積操作丰歌,得到的結(jié)果就是元素自身,沒(méi)有任何改變屉凯。比如立帖,如果是加法,他就是0悠砚,如果是乘法他就是1晓勇。
reduce(BinaryOperator b) 可以將流中元素反復(fù)結(jié)合起來(lái),得到一個(gè)值。返回 Optional
@Test
public  void reduceParallel() {
    List<Integer> lists = new ArrayList<>();
    lists.add(1);
    lists.add(2);
    lists.add(3);

    //每個(gè)元素都放大兩倍后绑咱,再求積
    Integer product = lists.parallelStream().reduce(1, (a, b) -> a *  (b * 2),
                                                    (a, b) -> a * b);
    System.out.println("product:" + product);//48

    Integer product2 = lists.parallelStream().reduce(1, (a, b) -> {
        System.out.println("第一個(gè)參數(shù):" + Thread.currentThread().getName() +",a="+a+",b="+b);
        return a *  (b * 2);},
                                                     (a, b) -> {
                                                         System.out.println("第二個(gè)參數(shù):" + Thread.currentThread().getName()+",c="+a+",d="+b);
                                                         return  a * b;
                                                     });
    System.out.println("product2:" + product);//48
}
6绰筛、終止操作——收集,注意這里返回的都是一個(gè)收集器Collector
方法 描述
collect(Collector c) 將流轉(zhuǎn)換為其他形式描融。接收一個(gè) Collector接口的實(shí)現(xiàn)铝噩,用于給Stream中元素做匯總的方法

三、關(guān)于各種收集器:

1窿克、均值——averaging
方法 描述
averagingInt(ToIntFunction<? super T> mapper) 接收一個(gè)函數(shù)作為參數(shù)骏庸,求該函數(shù)的返回值(int)的均值
averagingLong(ToLongFunction<? super T> mapper) 接收一個(gè)函數(shù)作為參數(shù),求該函數(shù)的返回值(long)的均值
averagingDouble(ToDoubleFunction<? super T> mapper) 接收一個(gè)函數(shù)作為參數(shù)年叮,求該函數(shù)的返回值(double)的均值
@Test
public void testAveraging() {
    List<Integer> lists = new ArrayList<>();
    lists.add(1);
    lists.add(2);
    lists.add(3);
    Double average = lists.stream().collect(Collectors.averagingInt(item -> item));
    System.out.println(average);
}
2具被、統(tǒng)計(jì)——元素個(gè)數(shù):counting
方法 描述
counting() 統(tǒng)計(jì)輸入元素的個(gè)數(shù)
@Test
public void testCounting() {
    List<Integer> lists = new ArrayList<>();
    lists.add(1);
    lists.add(2);
    lists.add(3);
    Long count = lists.stream().collect(Collectors.counting());
    System.out.println(count);
}
3、最值——maxBy只损、minBy
方法 描述
minBy(Comparator<? super T> comparator) 接收一個(gè)比較器一姿,返回最小值
maxBy(Comparator<? super T> comparator) 接收一個(gè)比較器,返回最大值
@Test
public void testMax() {
    List<Integer> lists = new ArrayList<>();
    lists.add(1);
    lists.add(2);
    lists.add(3);
    Optional<Integer> max = lists.stream().collect(Collectors.maxBy(Integer::compare));
    if (max.isPresent()){
        System.out.println(max.get());
    }
}
4改执、求和——summing啸蜜、summarizing
方法 描述
summingInt(ToIntFunction<? super T> mapper) 可以計(jì)算輸入元素的總和
summingLong(ToLongFunction<? super T> mapper) 可以計(jì)算輸入元素的總和
summingDouble(ToDoubleFunction<? super T> mapper) 可以計(jì)算輸入元素的總和
summarizingInt(ToIntFunction<? super T> mapper) 可以計(jì)算輸入元素的總和,平均值,數(shù)量,最值
summarizingLong(ToLongFunction<? super T> mapper) 可以計(jì)算輸入元素的總和,平均值,數(shù)量,最值
summarizingDouble(ToDoubleFunction<? super T> mapper) 可以計(jì)算輸入元素的總和,平均值,數(shù)量,最值
@Test
public void testSummary() {
    List<Integer> lists = new ArrayList<>();
    lists.add(1);
    lists.add(2);
    lists.add(3);
    Integer sum = lists.stream().collect(Collectors.summingInt((item) -> item));
    System.out.println(sum);

    IntSummaryStatistics summary = lists.stream().collect(Collectors.summarizingInt((item) -> item));
    System.out.println(summary.getSum());
    System.out.println(summary.getAverage());
    System.out.println(summary.getCount());
    System.out.println(summary.getMax());
    System.out.println(summary.getMin());
}
5坑雅、分組——groupingBy,groupingByConcurrent
方法 描述
groupingBy(Function<? super T, ? extends K> classifier) classifier提供結(jié)果Map(HashMap)的鍵
groupingBy(Function<? super T, ? extends K> classifier, Collector<? super T, A, D> downstream) downstream提供結(jié)果Map和值
groupingBy(Function<? super T, ? extends K> classifier, Supplier<M> mapFactory, Collector<? super T, A, D> downstream) mapFactory指定結(jié)果Map的類型
groupingByConcurrent(Function<? super T, ? extends K> classifier) classifier提供結(jié)果Map(HashMap)的鍵,將元素整理成ConcurrentMap
groupingByConcurrent(Function<? super T, ? extends K> classifier, Collector<? super T, A, D> downstream) downstream提供結(jié)果Map和值,將元素整理成ConcurrentMap
groupingByConcurrent(Function<? super T, ? extends K> classifier, Supplier<M> mapFactory,Collector<? super T, A, D> downstream) mapFactory指定結(jié)果Map的類型,將元素整理成ConcurrentMap
@Data
@Builder
static class Student{
    private Long id;
    private String name;
    private Long classId;
    private Integer age;
}

@Test
public void testGroup() {
    List<Student> list = new ArrayList<>();
    Student zhangSan = Student.builder().id(1L).name("張三").classId(1L).age(20).build();
    Student liSi = Student.builder().id(2L).name("李四").classId(1L).age(21).build();
    Student wangWu = Student.builder().id(3L).name("王五").classId(2L).age(21).build();
    Student zhaoLiu = Student.builder().id(4L).name("趙六").classId(1L).age(21).build();
    list.add(liSi);
    list.add(zhangSan);
    list.add(wangWu);
    list.add(zhaoLiu);

    //根據(jù)classId分組
    Map<Long, List<Student>> map1 = list.stream().collect(Collectors.groupingBy(Student::getClassId));
    System.out.println("map1:\n" + map1);
    //統(tǒng)計(jì)各個(gè)classId的人數(shù)
    Map<Long, Long> map2 = list.stream().collect(Collectors.groupingBy(Student::getClassId,
                                                                       Collectors.counting()));
    System.out.println("map2:\n" + map2);
    //統(tǒng)計(jì)各個(gè)classId的人數(shù)
    Map<Long, Long> map3 = list.stream().collect(Collectors.groupingBy(Student::getClassId,
                                                                       HashMap::new,
                                                                       Collectors.counting()));
    System.out.println("map3:\n" + map3);
}
6辈挂、分區(qū)——partitioningBy
方法 描述
partitioningBy(Predicate<? super T> predicate) 該操作將輸入元素分為兩類(即鍵是true和false的Map),predicate提供分區(qū)依據(jù)
partitioningBy(Predicate<? super T> predicate,Collector<? super T, A, D> downstream) 該操作將輸入元素分為兩類(即鍵是true和false的Map),downstream提供結(jié)果Map的值
@Test
public void testPartitioning() {
    List<Student> list = new ArrayList<>();
    Student zhangSan = Student.builder().id(1L).name("張三").classId(1L).age(20).build();
    Student liSi = Student.builder().id(2L).name("李四").classId(1L).age(21).build();
    Student wangWu = Student.builder().id(3L).name("王五").classId(2L).age(21).build();
    Student zhaoLiu = Student.builder().id(4L).name("趙六").classId(1L).age(21).build();
    list.add(liSi);
    list.add(zhangSan);
    list.add(wangWu);
    list.add(zhaoLiu);

    Map<Boolean, List<Student>> map = list.stream().collect(Collectors.partitioningBy((item -> item.getAge() > 20)));
    System.out.println("map:\n" + map);

    Map<Boolean, Long> map1 = list.stream().collect(Collectors.partitioningBy((item -> item.getAge() > 20), 
                                                                              Collectors.counting()));
    System.out.println("map1:\n" + map1);//{false=1, true=3}
}
7、Collector之后再操作——collectingAndThen
方法 描述
collectingAndThen(Collector<T,A,R> downstream, Function<R,RR> finisher) downstream(Collector類型)和finisher(Function類型)裹粤,在調(diào)用downstream之后终蒂,將調(diào)用結(jié)果值作為finisher的傳入值,再調(diào)用finisher遥诉。
@Test
public void testCollectingAndThen() {
    List<Integer> list = new ArrayList<>();
    list.add(1);
    list.add(2);
    list.add(3);
    String result = list.stream().collect(Collectors.collectingAndThen(Collectors.counting(),
                                                                       (ret) -> "統(tǒng)計(jì)結(jié)果為=" + ret));
    System.out.println(result);
}
8拇泣、拼接——joining
方法 描述
joining() 將輸入元素(字符串類型)拼接成字符串,拼接輸入元素
joining(CharSequence delimiter) 將輸入元素(字符串類型)拼接成字符串,將delimiter作為分隔符
joining(CharSequence delimiter, CharSequence prefix, CharSequence suffix) 將輸入元素(字符串類型)拼接成字符串,將prefix作為前綴,suffix作為后綴
@Test
public void testCollectingAndThen() {
    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    String result = list.stream().collect(Collectors.joining());
    System.out.println(result);//abc
    String result2 = list.stream().collect(Collectors.joining("-"));
    System.out.println(result2);//a-b-c
    String result3 = list.stream().collect(Collectors.joining(",", "[", "]"));
    System.out.println(result3);//[a,b,c]
}
9矮锈、mapping
方法 描述
mapping(Function<? super T, ? extends U> mapper,Collector<? super U, A, R> downstream) mapper(Function類型)和downstream(Collector類型)霉翔,在調(diào)用mapper之后,將調(diào)用結(jié)果的返回值作為downstream的輸入元素苞笨,再調(diào)用downstream
@Test
public void testMapping() {
    List<Student> list = new ArrayList<>();
    Student zhangSan = Student.builder().id(1L).name("張三").classId(1L).age(20).build();
    Student liSi = Student.builder().id(2L).name("李四").classId(1L).age(21).build();
    Student wangWu = Student.builder().id(3L).name("王五").classId(2L).age(21).build();
    Student zhaoLiu = Student.builder().id(4L).name("趙六").classId(1L).age(21).build();
    list.add(liSi);
    list.add(zhangSan);
    list.add(wangWu);
    list.add(zhaoLiu);
    String result = list.stream().collect(Collectors.mapping(Student::getName, Collectors.joining(",", "[", "]")));
    System.out.println(result);//[李四,張三,王五,趙六]
}
10债朵、縮減——reducing
方法 描述
reducing(BinaryOperator<T> op) 對(duì)輸入元素執(zhí)行縮減操作,對(duì)輸入的元素應(yīng)用op操作
reducing(T identity, BinaryOperator<T> op) 對(duì)輸入元素執(zhí)行縮減操作,提供初始值identity
reducing(U identity, Function<? super T, ? extends U> mapper, BinaryOperator<U> op) 對(duì)輸入元素執(zhí)行縮減操作,在對(duì)元素進(jìn)行op操作之前,先進(jìn)行mapper操作
@Test
public void testReducing() {
    List<Integer> list = new ArrayList<>();
    list.add(1);
    list.add(2);
    list.add(3);
    //求和,返回Optional
    Optional<Integer> result = list.stream().collect(Collectors.reducing((a, b) -> a + b));
    if (result.isPresent()){
        System.out.println(result.get());//6
    }
    //求和,返回Integer
    Integer result2 = list.stream().collect(Collectors.reducing(0, (a, b) -> a + b));
    System.out.println(result2);//6
    //每個(gè)元素先平方,再求和
    Integer result3 = list.stream().collect(Collectors.reducing(0, item -> item * item, (a, b) -> a + b));
    System.out.println(result3);//14
}
11瀑凝、集合轉(zhuǎn)化——toCollection序芦、toList與toSet
方法 描述
toCollection(Supplier<C> collectionFactory) 將輸入元素整理成集合,collectionFactory可以指定結(jié)果集合的類型粤咪,將輸入元素整理成集合
toList() 將輸入元素整理成集合谚中,將輸入元素整理成ArrayList
toSet() 將輸入元素整理成集合,將輸入元素整理成HashSet
@Test
public void testToCollection() {
    List<Student> list = new ArrayList<>();
    Student zhangSan = Student.builder().id(1L).name("張三").classId(1L).age(20).build();
    Student liSi = Student.builder().id(2L).name("李四").classId(1L).age(21).build();
    Student wangWu = Student.builder().id(3L).name("王五").classId(2L).age(21).build();
    Student zhaoLiu = Student.builder().id(4L).name("趙六").classId(1L).age(21).build();
    list.add(liSi);
    list.add(zhangSan);
    list.add(wangWu);
    list.add(zhaoLiu);
    List<Student> toList = list.stream().filter(item -> item.getClassId().equals(1L)).collect(Collectors.toList());
    Set<Student> toSet = list.stream().filter(item -> item.getClassId().equals(1L)).collect(Collectors.toSet());
    ArrayList<Student> toCollection = list.stream().filter(item -> item.getClassId().equals(1L)).collect(Collectors.toCollection(ArrayList::new));
}
12、Map轉(zhuǎn)化——toMap與toConcurrentMap
方法 描述
toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper) 將輸入元素整理成Map宪塔,keyMapper和valueMapper分別提供結(jié)果Map的鍵和值
toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction) 將輸入元素整理成Map磁奖,mergeFunction對(duì)鍵相同的值進(jìn)行累積
toMap(Function<? super T, ? extends K> keyMapper, Function<? super T, ? extends U> valueMapper, BinaryOperator<U> mergeFunction, Supplier<M> mapSupplier) 將輸入元素整理成Map,mapSupplier可以指定結(jié)果的Map類型
@Test
public void testToMap() {
    List<Student> list = new ArrayList<>();
    Student zhangSan = Student.builder().id(1L).name("張三").classId(1L).age(20).build();
    Student liSi = Student.builder().id(2L).name("李四").classId(1L).age(21).build();
    Student wangWu = Student.builder().id(3L).name("王五").classId(2L).age(21).build();
    Student zhaoLiu = Student.builder().id(4L).name("趙六").classId(1L).age(21).build();
    list.add(liSi);
    list.add(zhangSan);
    list.add(wangWu);
    list.add(zhaoLiu);

    //轉(zhuǎn)為map,存在相同的key的話會(huì)拋異常
    Map<Long, String> map = list.stream().collect(Collectors.toMap(item -> item.getId(), 
                                                                   item -> item.getName()));
    System.out.println(map);//{1=張三, 2=李四, 3=王五, 4=趙六}

    //轉(zhuǎn)化為map,若key相等,取后一個(gè)
    Student zhaoLiu2 = Student.builder().id(4L).name("趙六2").classId(1L).age(21).build();
    list.add(zhaoLiu2);
    Map<Long, String> map1 = list.stream().collect(Collectors.toMap(item -> item.getId(), 
                                                                    item -> item.getName(), 
                                                                    (a, b) -> b));
    System.out.println(map1);//{1=張三, 2=李四, 3=王五, 4=趙六2}

    //指定返回的map類型為TreeMap
    TreeMap<Long, String> map3 = list.stream().collect(Collectors.toMap(item -> item.getId(), 
                                                                        item -> item.getName(), 
                                                                        (a, b) -> b, 
                                                                        TreeMap::new));
    System.out.println(map3);//{1=張三, 2=李四, 3=王五, 4=趙六2}

}

參考文章:http://www.reibang.com/p/ac2bcf2f9d48
參考文章:https://blog.csdn.net/xiliunian/article/details/88773718
參考文章:https://blog.csdn.net/weixin_44187730/article/details/93737517

最后編輯于
?著作權(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)店門怠苔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)同廉,“玉大人,你說(shuō)我怎么就攤上這事柑司∑刃ぃ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,852評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵攒驰,是天一觀的道長(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)容

  • Java8實(shí)戰(zhàn)之Stream 前言 在前面一個(gè)小節(jié)中,我們已經(jīng)學(xué)習(xí)了行為參數(shù)化以及Lambda表達(dá)式利诺,通過(guò)Lamb...
    顏洛濱閱讀 1,036評(píng)論 0 2
  • 本筆記來(lái)自 計(jì)算機(jī)程序的思維邏輯 系列文章 Lambda表達(dá)式 Lambda表達(dá)式 語(yǔ)法 匿名函數(shù)立倍,由 -> 分隔...
    碼匠閱讀 468評(píng)論 0 6
  • Int Double Long 設(shè)置特定的stream類型比伏, 提高性能疆导,增加特定的函數(shù) 無(wú)存儲(chǔ)澈段。stream不是一...
    patrick002閱讀 1,268評(píng)論 0 0
  • Java流庫(kù)(java.util.stream) 流提供了一種讓我們可以在比集合更高的概念級(jí)別上指定計(jì)算的數(shù)據(jù)視圖...
    thorhill閱讀 4,838評(píng)論 0 4
  • 1 函數(shù)式接口和lambda表達(dá)式 函數(shù)式接口函數(shù)式接口就是有且只有一個(gè)抽象方法的接口兽叮,需要注意的是鹦聪,如果方法覆蓋...
    曾豬666閱讀 974評(píng)論 0 0