Java 8 新特性

lambda表達(dá)式

函數(shù)式接口: 只有一個(gè)方法的接口

四大函數(shù)式接口

Function函數(shù)式接口:有一個(gè)輸入?yún)?shù)辱士,有一個(gè)輸出
斷定型接口:有一個(gè)輸入?yún)?shù)溺健,返回值只能是 布爾值!
Consumer 消費(fèi)型接口:只有輸入膝但,沒有返回值
Supplier 供給型接口:沒有參數(shù)荒辕,只有返回值

Stream流式計(jì)算

流(Stream)是數(shù)據(jù)渠道,用于操作數(shù)據(jù)源(集合器罐、數(shù)組等)所生成的元素序列梢为。
集合講的是數(shù)據(jù),流講的是計(jì)算

Stream自己不會(huì)存儲(chǔ)數(shù)據(jù)元素
Stream不會(huì)改變?cè)瓕?duì)象轰坊,相反铸董,他們會(huì)返回一個(gè)持有結(jié)果的新Stream
Stream操作是延時(shí)執(zhí)行的。

Stream的三個(gè)步驟

1.創(chuàng)建Steam

     //1.可以通過Collection系列集合提供的stream()或者parallelStream()
        ArrayList<String> list = new ArrayList<>();
        Stream<String> stream = list.stream();
        //2.通過Arrays中靜態(tài)方法stream()創(chuàng)建
        int [] array=new int[6];
        Arrays.stream(array);
        //3.通過Stream中的靜態(tài)方法of()
        Stream<String> stringStream = Stream.of("aa", "bb", "cc");
        //4.創(chuàng)建無限流  迭代
        Stream<Integer> iterate = Stream.iterate(0, (a) -> a + 2);
        iterate.forEach(System.out::println);

2.中間操作

API

List<User> list = new ArrayList<User>(){
    {
        add(new User(1l,"張三",10, "清華大學(xué)"));
        add(new User(2l,"李四",12, "清華大學(xué)"));
        add(new User(3l,"王五",15, "清華大學(xué)"));
        add(new User(4l,"趙六",12, "清華大學(xué)"));
        add(new User(5l,"田七",25, "北京大學(xué)"));
        add(new User(6l,"小明",16, "北京大學(xué)"));
        add(new User(7l,"小紅",14, "北京大學(xué)"));
        add(new User(8l,"小華",14, "浙江大學(xué)"));
        add(new User(9l,"小麗",17, "浙江大學(xué)"));
        add(new User(10l,"小何",10, "浙江大學(xué)"));
    }
}

filter--接受Lambda 從流中排除某些元素

System.out.println("學(xué)校是清華大學(xué)的user");
List<User> userList1 = list.stream().filter(user -> "清華大學(xué)".equals(user.getSchool())).collect(Collectors.toList());
userList1.forEach(user -> System.out.print(user.name + '肴沫、'));
學(xué)校是清華大學(xué)的user
張三粟害、李四、王五颤芬、趙六悲幅、

limit(n)--截?cái)嗔鳎箶?shù)量不超過給定值

System.out.println("年齡是偶數(shù)的前兩位user");
List<User> userList3 = list.stream().filter(user -> user.getAge() % 2 == 0).limit(2).collect(Collectors.toList());
userList3.forEach(user -> System.out.print(user.name + '站蝠、'));
年齡是偶數(shù)的前兩位user
張三汰具、李四、

skip(n)--跳過前n個(gè)元素

System.out.println("跳過前面兩個(gè)user的其他所有user");
List<User> userList5 = list.stream().skip(2).collect(Collectors.toList());
userList5.forEach(user -> System.out.print(user.name + '菱魔、'));
跳過前面兩個(gè)user的其他所有user
王五留荔、趙六、田七澜倦、小明聚蝶、小紅、小華藻治、小麗碘勉、小何、

distinct--篩選 去重

System.out.println("所有user的年齡集合");
List<Integer> userAgeList = list.stream().map(User::getAge).distinct().collect(Collectors.toList());
System.out.println("userAgeList = " + userAgeList);
所有user的年齡集合
userAgeList = [10, 12, 15, 25, 16, 14, 17]

sorted--自然排序

System.out.println("按年齡從大到小排序");
List<User> userList4 = list.stream().sorted((s1,s2) -> s2.age - s1.age).collect(Collectors.toList());
userList4.forEach(user -> System.out.print(user.name + '栋艳、'));
按年齡從大到小排序
田七恰聘、小麗、小明、王五晴叨、小紅凿宾、小華、李四兼蕊、趙六初厚、張三、小何孙技、

sorted()--定制排序
map--對(duì)每個(gè)元素進(jìn)行操作

System.out.println("學(xué)校是清華大學(xué)的user的名字");
List<String> userList6 = list.stream().filter(user -> "清華大學(xué)".equals(user.school)).map(User::getName).collect(Collectors.toList());
userList6.forEach(user -> System.out.print(user + '产禾、')); 
學(xué)校是清華大學(xué)的user的名字
張三、李四牵啦、王五亚情、趙六、
/**
* 題目要求:一分鐘內(nèi)完成此題哈雏,只能用一行代碼實(shí)現(xiàn)楞件!
* 現(xiàn)在有5個(gè)用戶!篩選:
* 1裳瘪、ID 必須是偶數(shù)
* 2土浸、年齡必須大于23歲
* 3、用戶名轉(zhuǎn)為大寫字母
* 4彭羹、用戶名字母倒著排序
* 5黄伊、只輸出一個(gè)用戶!
*/

public static void main(String[] args) {
User u1 = new User(1,"a",21);
User u2 = new User(2,"b",22);
User u3 = new User(3,"c",23);
User u4 = new User(4,"d",24);
User u5 = new User(6,"e",25);
// 集合就是存儲(chǔ)
List<User> list = Arrays.asList(u1, u2, u3, u4, u5);
// 計(jì)算交給Stream流
// lambda表達(dá)式派殷、鏈?zhǔn)骄幊袒棺睢⒑瘮?shù)式接口、Stream流式計(jì)算
list.stream()
.filter(u->{return u.getId()%2==0;})
.filter(u->{return u.getAge()>23;})
.map(u->{return u.getName().toUpperCase();})
.sorted((uu1,uu2)->{return uu2.compareTo(uu1);})
.limit(1)
.forEach(System.out::println);
}

3.終止操作

API

查找與匹配

allMatch--檢查是否匹配所有元素
anyMatch--檢查是否至少匹配一個(gè)元素
noneMatch--檢查是否沒有匹配所有元素
findFirst--返回第一個(gè)元素
findAny--返回當(dāng)前流中的任意元素
count--返回流中的總個(gè)數(shù)
max--返回流中的最大值
min--返回流中的最小值

歸納

reduce(T identity 愈腾, BinaryOperator)--可以將流中元素反復(fù)結(jié)合起來得到一個(gè)值

收集

collect--將流轉(zhuǎn)換為其他形式憋活,接收一個(gè)Collector接口的實(shí)現(xiàn),用于給Stream中元素做匯總的方法

Optional類

Optional是一個(gè)容器類虱黄,代表一個(gè)值存在或者不存在悦即,原來用null表示一個(gè)值不存在,現(xiàn)在Optional可以更好的表達(dá)這個(gè)概念橱乱,并且避免空指針異常

常用方法

Optional.of(T t):創(chuàng)建一個(gè)Optional實(shí)例
Optional.empty():創(chuàng)建一個(gè)空的Optional實(shí)例
Optional.ofNullable(T t):若t不為null 創(chuàng)建Optional實(shí)例 否則創(chuàng)建空實(shí)例
isPresent():判斷是否包含值
orElse(T t):如果調(diào)用對(duì)象包含值辜梳,返回該值,否則返回t
orElseGet(Supplier s):如果調(diào)用對(duì)象包含值泳叠,返回該值 否則返回s的值
map(Function f):如果有值對(duì)其處理 并返回處理后的Optional 否則返回Optional.empty()
flatMap(Function f): 于map相似 要求返回值必須是Optional

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末作瞄,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子危纫,更是在濱河造成了極大的恐慌宗挥,老刑警劉巖乌庶,帶你破解...
    沈念sama閱讀 206,602評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異契耿,居然都是意外死亡瞒大,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門搪桂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來透敌,“玉大人,你說我怎么就攤上這事踢械⌒锏纾” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵内列,是天一觀的道長(zhǎng)撵术。 經(jīng)常有香客問我,道長(zhǎng)话瞧,這世上最難降的妖魔是什么荷荤? 我笑而不...
    開封第一講書人閱讀 55,306評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮移稳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘会油。我一直安慰自己个粱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,330評(píng)論 5 373
  • 文/花漫 我一把揭開白布翻翩。 她就那樣靜靜地躺著都许,像睡著了一般。 火紅的嫁衣襯著肌膚如雪嫂冻。 梳的紋絲不亂的頭發(fā)上胶征,一...
    開封第一講書人閱讀 49,071評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音桨仿,去河邊找鬼睛低。 笑死,一個(gè)胖子當(dāng)著我的面吹牛服傍,可吹牛的內(nèi)容都是我干的钱雷。 我是一名探鬼主播,決...
    沈念sama閱讀 38,382評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼吹零,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼罩抗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起灿椅,我...
    開封第一講書人閱讀 37,006評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤套蒂,失蹤者是張志新(化名)和其女友劉穎钞支,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體操刀,經(jīng)...
    沈念sama閱讀 43,512評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烁挟,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,965評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了馍刮。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片信夫。...
    茶點(diǎn)故事閱讀 38,094評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖卡啰,靈堂內(nèi)的尸體忽然破棺而出静稻,到底是詐尸還是另有隱情,我是刑警寧澤匈辱,帶...
    沈念sama閱讀 33,732評(píng)論 4 323
  • 正文 年R本政府宣布振湾,位于F島的核電站,受9級(jí)特大地震影響亡脸,放射性物質(zhì)發(fā)生泄漏押搪。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,283評(píng)論 3 307
  • 文/蒙蒙 一浅碾、第九天 我趴在偏房一處隱蔽的房頂上張望大州。 院中可真熱鬧,春花似錦垂谢、人聲如沸厦画。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽根暑。三九已至,卻和暖如春徙邻,著一層夾襖步出監(jiān)牢的瞬間排嫌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工缰犁, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留淳地,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,536評(píng)論 2 354
  • 正文 我出身青樓民鼓,卻偏偏與公主長(zhǎng)得像薇芝,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子丰嘉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,828評(píng)論 2 345

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

  • java8新特性 原創(chuàng)者:文思 一夯到、特性簡(jiǎn)介 速度更快 代碼更少,增加了Lambda 強(qiáng)大的Stream API ...
    文思li閱讀 3,032評(píng)論 1 1
  • 本筆記來自 計(jì)算機(jī)程序的思維邏輯 系列文章 Lambda表達(dá)式 Lambda表達(dá)式 語法 匿名函數(shù)饮亏,由 -> 分隔...
    碼匠閱讀 467評(píng)論 0 6
  • Java8新特性 Lambda表達(dá)式 概念 lambda表達(dá)式是一段可以傳遞的代碼耍贾,它的核心思想是將面向?qū)ο笾械膫?..
    好好秦先生閱讀 821評(píng)論 0 1
  • 函數(shù)式接口 java內(nèi)置四大核心函數(shù)式接口 核心接口子接口 方法引用與構(gòu)造器引用 當(dāng)要傳遞給Lambda體的操作,...
    Java架構(gòu)大仙閱讀 1,512評(píng)論 1 3
  • 一晃听、重要數(shù)據(jù)結(jié)構(gòu)和JVM的改動(dòng) 1.HashMap的改動(dòng) HashMap維護(hù)了一個(gè)Entry數(shù)組,put(K ke...
    一只愛java的貓閱讀 467評(píng)論 0 0