java8 Stream

做個記錄:
Person.java

import lombok.Data;

/**
 * @Description:
 * @Author: ljf  <lin652210786@163.com>
 * @Date: 2019/12/02
 */
@Data
public class Person {
    private String name;
    private int age;
    public Person(String name,int age){
        this.name = name;
        this.age = age;
    }
}

新建測試類:test.java

import java.util.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;

import static java.util.stream.Collectors.toList;

/**
 * @Description:  java8 Stream
 * @Author: ljf  <lin652210786@163.com>
 * @Date: 2019/12/02
 */
public class listtest {

    //java8 Stream
    public static void main(String[] args) {
        List<Person> list = new ArrayList<>();
        list.add(new Person("jack", 27));
        list.add(new Person("mike", 25));
        list.add(new Person("tom", 30));
        list.add(new Person("age", 31));

        //1.0 根據(jù)條件返回集合
        List a = new ArrayList();
        //filter(T -> boolean)
        a = list.stream().filter(Person -> Person.getAge() > 20).collect(toList());

        //2.0 distinct() 去重
        List<Person> list1 = new ArrayList<>();
        {
            list1.add(new Person("Core Java", 200));
            list1.add(new Person("Core Java", 200));
            list1.add(new Person("Learning Freemarker", 150));
            list1.add(new Person("Spring MVC", 300));
            list1.add(new Person("Spring MVC", 300));
        }
        long l1 = list.stream().distinct().count();
        System.out.println("No. of distinct books:"+l1);
        list1.stream().distinct().forEach(b -> System.out.println(b.getName()+ "," + b.getAge()));

        //2.1 去重
        List<String> list2 = Arrays.asList("AA", "BB", "CC", "BB", "CC", "AA", "AA");
        long l2 = list2.stream().distinct().count();
        System.out.println("No. of distinct elements:"+l2);
        String output = list2.stream().distinct().collect(Collectors.joining(","));
        System.out.println(output);

        //2.2 去重
        List<Person> list3 = new ArrayList<>();
        {
            list3.add(new Person("Core Java", 200));
            list3.add(new Person("Core Java", 300));
            list3.add(new Person("Learning Freemarker", 150));
            list3.add(new Person("Spring MVC", 200));
            list3.add(new Person("Hibernate", 300));
        }
        list3.stream().filter(distinctByKey(b -> b.getName()))
                .forEach(b -> System.out.println(b.getName()+ "," + b.getAge()));


        //3.0 排序
        //根據(jù)年齡大小來比較:
        /*list = list.stream()
                .sorted((p1, p2) -> p1.getAge() - p2.getAge())
                .collect(toList());*/

        //3.1 簡化排序
        /*list = list.stream()
                .sorted(Comparator.comparingInt(Person::getAge))
                .collect(toList());*/

        //4.0 limit(long n)
        //返回前 n 個元素
        /*list = list.stream()
                .limit(2)
                .collect(toList());*/

        //5.0 skip(long n)
        //去除前 n 個元素
        /*list = list.stream()
                .skip(2)
                .collect(toList());*/

        // 5.1  先獲取list集合的前兩位元素 在獲取的元素中取出第一位元素
        //limit  和 skip 靈活運用
        /*list = list.stream()
                .limit(2)
                .skip(1)
                .collect(toList());*/


        //6.0 map(T -> R)
        //將流中的每一個元素 T 映射為 R(類似類型轉(zhuǎn)換)
        /*List<String> newlist =
                list.stream().map(Person::getName).collect(toList());*/


        //7.0 flatMap(T -> Stream)
        //將流中的每一個元素 T 映射為一個流运挫,再把每一個流連接成為一個流
        //首先 map 方法分割每個字符串元素损话,但此時流的類型為 Stream镜撩,因為 split 方法返回的是 String[ ] 類型帜慢;
        // 所以我們需要使用 flatMap 方法隔披,先使用Arrays::stream將每個 String[ ] 元素變成一個 Stream流,
        // 然后 flatMap 會將每一個流連接成為一個流,最終返回我們需要的 Stream
        List<String> list4 = new ArrayList<>();
        list4.add("aaa bbb ccc");
        list4.add("ddd eee fff");
        list4.add("ggg hhh iii");

        list4 = list4.stream().map(s -> s.split(" ")).
                flatMap(Arrays::stream).collect(toList());


        //8.0 anyMatch(T -> boolean)
        //流中是否有一個元素匹配給定的 T -> boolean 條件
        //是否存在一個 person 對象的 age 等于 20:
        boolean b = list.stream().anyMatch(person -> person.getAge() == 27);

        //9.0 allMatch(T -> boolean)
        //流中是否所有元素都匹配給定的 T -> boolean 條件
        boolean b1 = list.stream().allMatch(person -> person.getAge() == 27);

        //10.0 noneMatch(T -> boolean)
        //流中是否沒有元素匹配給定的 T -> boolean 條件


        //11.0 findAny() 和 findFirst()
        //findAny():找到其中一個元素 (使用 stream() 時找到的是第一個元素;使用 parallelStream() 并行時找到的是其中一個元素)
        //findFirst():找到第一個元素
        //String b2 = list.stream().findFirst(person -> person);
        Person a5 = list.stream().filter(b5 -> "age".equals(b5.getName())).findAny().get();
        //添加orElse() 可以在不滿足條件的情況下 自定義返回值  不會跑出異常
        Person a6 = list.stream().filter(b5 -> "age11".equals(b5.getName())).findAny().orElse(null);;
        System.out.println(a6);


        //13.0 計算年齡總和: 其中昔逗,reduce 第一個參數(shù) 0 代表起始值為 0,lambda (a, b) -> a + b 即將兩值相加產(chǎn)生一個新值篷朵。
        int sum = list.stream().map(Person::getAge).reduce(0, (a1, c1) -> a1 + c1);
        //與之相同:
        int sum1 = list.stream().map(Person::getAge).reduce(0, Integer::sum);

        //計算年齡總乘積:
        int sum2 = list.stream().map(Person::getAge).reduce(1, (a2, c2) -> a2 * c2);
        //當(dāng)然也可以
        Optional<Integer> sum3 = list.stream().map(Person::getAge).reduce(Integer::sum);

        //14.0 count()
        //返回流中元素個數(shù)勾怒,結(jié)果為 long 類型
        long l3 = list.stream().count();

        //15.0 collect()
        //收集方法,我們很常用的是 collect(toList())声旺,當(dāng)然還有 collect(toSet()) 等控硼,參數(shù)是一個收集器接口,這個后面會另外講艾少。

        Set<Person> set = list.stream().collect(Collectors.toSet());

        //16.0 forEach()
        //返回結(jié)果為 void,很明顯我們可以通過它來干什么了
        list.stream().forEach(System.out ::println);

        //向數(shù)據(jù)庫插入新元素:
        //list.stream().forEach(PersonMapper::insertPerson);

        System.out.println("-------------------");
    }

    //distinct()功能
    private static <T> Predicate<T> distinctByKey(Function<? super T, ?> keyExtractor) {
        Map<Object,Boolean> seen = new ConcurrentHashMap<>();
        return t -> seen.putIfAbsent(keyExtractor.apply(t), Boolean.TRUE) == null;
    }

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末翼悴,一起剝皮案震驚了整個濱河市缚够,隨后出現(xiàn)的幾起案子幔妨,更是在濱河造成了極大的恐慌,老刑警劉巖谍椅,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件误堡,死亡現(xiàn)場離奇詭異,居然都是意外死亡雏吭,警方通過查閱死者的電腦和手機锁施,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杖们,“玉大人悉抵,你說我怎么就攤上這事≌辏” “怎么了姥饰?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長孝治。 經(jīng)常有香客問我列粪,道長,這世上最難降的妖魔是什么谈飒? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任岂座,我火速辦了婚禮,結(jié)果婚禮上杭措,老公的妹妹穿的比我還像新娘费什。我一直安慰自己,他們只是感情好瓤介,可當(dāng)我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布吕喘。 她就那樣靜靜地躺著,像睡著了一般刑桑。 火紅的嫁衣襯著肌膚如雪氯质。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天祠斧,我揣著相機與錄音闻察,去河邊找鬼。 笑死琢锋,一個胖子當(dāng)著我的面吹牛辕漂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吴超,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼钉嘹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了鲸阻?” 一聲冷哼從身側(cè)響起跋涣,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤缨睡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后陈辱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體奖年,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年沛贪,在試婚紗的時候發(fā)現(xiàn)自己被綠了陋守。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡利赋,死狀恐怖水评,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情隐砸,我是刑警寧澤之碗,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站季希,受9級特大地震影響褪那,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜式塌,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一博敬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧峰尝,春花似錦偏窝、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至火窒,卻和暖如春硼补,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背熏矿。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工已骇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人票编。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓褪储,卻偏偏與公主長得像,于是被迫代替她去往敵國和親慧域。 傳聞我的和親對象是個殘疾皇子鲤竹,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,435評論 2 359