java8

Day1:


1. Lambda表達(dá)式

  • Lambda表達(dá)式的基本結(jié)構(gòu):
    (param1,param2,param3,paramN) ->{body}
  • 關(guān)于函數(shù)式接口:
  1. 如果一個(gè)接口只有一個(gè)抽象方法淌铐,那么該接口就是一個(gè)函數(shù)式接口。
  2. 如果我們在某個(gè)接口上聲明了FunctionalInterface注解,那么編譯器就會(huì)按照函數(shù)式接口的定義來要求該接口。
  3. 如果某個(gè)接口只有一個(gè)抽象方法,但我們沒有給該接口聲明FunctionalInterface注解席吴,那么編譯器依舊會(huì)將該接口看作是函數(shù)式接口溅漾。
    ps(為什么函數(shù)式接口中只有一個(gè)抽象方法:因?yàn)樵贚ambad表達(dá)式中并沒有指定方法名字(所以函數(shù)式接口中的方法只能有一個(gè)))
    在java中Lambad表示式是對象扩淀,他們必須依附于一類特別的對象函數(shù)——函數(shù)式接口(functional interface)
test2.myTest(()-> {
            System.out.println("MyInterface");
        });
//method reference(方法引用)
list.forEach(System.out::println);
List<String> list = Arrays.asList("nihao", "xiaoming");
        list.forEach(item -> System.out.println(item.toUpperCase()));
        List<String> list1 = new ArrayList<>();
        list.forEach(item -> list1.add(item.toUpperCase()));
        list.stream().map(item ->item.toUpperCase()).forEach(item -> System.out.println(item));
        list.stream().map(String::toUpperCase).forEach(item-> System.out.println(item));

運(yùn)行結(jié)果

"C:\Program Files\Java\jdk1.8.0_201\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1\lib\idea_rt.jar=59655:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_201\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_201\jre\lib\rt.jar;C:\Users\user\ideaTest\java8\target\classes" com.mobius.vision.jdk8.Test3
NIHAO
XIAOMING
NIHAO
XIAOMING
NIHAO
XIAOMING

Lamdba表達(dá)式的作用:

  • 傳遞行為哎甲,而不僅僅是值。
  • 提升抽象層次
  • API重用性更好
  • 更加靈活

Java Lambda結(jié)構(gòu)

  • 一個(gè)Lambda表達(dá)式可以有零個(gè)或多個(gè)參數(shù)
  • 參數(shù)的類型既可以明確聲明饲嗽,也可以根據(jù)上下文來推斷炭玫。例如:(int a)與(a)效果相同。
  • 空圓括號(hào)代表參數(shù)集為空貌虾。例如:()->42
  • (args1,args2....)->{body} Lambda表達(dá)式的語法
System.out.println(functionTest.addThe(1,2,(value1,value2)->value1+value2,value3->value3*value3));
        //先將1和2作為參數(shù)給biFunction:1+2得3然后將3作為參數(shù)給function3*3得9
    }
    public Integer addThe(int a,int b,BiFunction<Integer,Integer,Integer> biFunction,
                          Function<Integer,Integer> function){
        return biFunction.andThen(function).apply(a,b);
    }

Lambda表達(dá)式的一些操作

package com.mobius.vision.jdk8;

import java.util.Arrays;
import java.util.List;
import java.util.function.BiFunction;
import java.util.stream.Collectors;

/**
 * @author NingXioaoming
 * @createTime 2019/11/8 11:05
 * @description
 */
public class Test4 {
    public static void main(String[] args) {
        Person person = new Person();
        person.setUserName("zhangsan");
        person.setAge(18);
        Person person1 = new Person();
        person1.setUserName("lisi");
        person1.setAge(20);
        Person person2 = new Person();
        person2.setUserName("wangwu");
        person2.setAge(22);
        List<Person> list = Arrays.asList(person, person1, person2);

        Test4 test4 = new Test4();
        List<Person> persons = test4.getPersonsByUsername("zhangsan", list);
        persons.forEach(pp-> System.out.println(pp.getUserName()));

        List<Person> personsByUsername = test4.getPersonsByUsername(20, list);
        personsByUsername.forEach(user-> System.out.println(user.getAge()));

        List<Person> personsByT = test4.getPersonsByT(19, list, (age, list1) ->
                list1.stream().filter(person3 -> person3.getAge() > age).collect(Collectors.toList())
        );
        personsByT.forEach(person3 -> System.out.println(person3.getAge()));
    }
    public List<Person> getPersonsByT(Integer age,List<Person> list,BiFunction<Integer,List<Person>,List<Person>> biFunction){
        return biFunction.apply(age,list);
    }
    public List<Person> getPersonsByUsername(String userName, List<Person> list){
        list.forEach(person -> System.out.println(person.getUserName()));
        return list.stream().filter(person1 -> person1.getUserName().equals(userName)).collect(Collectors.toList());
    }
    public List<Person> getPersonsByUsername(Integer age,List<Person> list){
        BiFunction<Integer,List<Person>,List<Person>> biFunction =(age1,personList)->
             personList.stream().filter(person -> person.getAge()>age).collect(Collectors.toList());
        return biFunction.apply(age,list);
    }
}

Day2:


1. Optional

optional的一些使用方法

        Optional<String> heloo = Optional.of("1111");//一定不為空
        Optional<String> heloo1 = Optional.empty();//一定為空
        Optional<String> heloo2 = Optional.ofNullable("1111");//不確定是否為空
        heloo.ifPresent(item -> System.out.println(item));

判斷person是否為空方法

        List<String> list = Arrays.asList("nihapo", "wohap");
        List<String> list1 = Arrays.asList();
        Person person = new Person();
        person.setList(list1);
        Optional<Person> optional = Optional.ofNullable(person);
        //判斷person是否為空方法
        System.out.println(optional.map(thePerson->thePerson.getList()).orElse(Collections.emptyList()));

方法引用

  • 方法引用:method reference
  • 方法引用實(shí)際上是個(gè)Lambda表達(dá)式的一種語法糖
  • 我們可以將方法引用看做是一個(gè)【函數(shù)指針】吞加,function pointer,
  • 方法引用共分為4類
    1. 類名::靜態(tài)方法名尽狠。
    2. 引用名(對象名)::實(shí)類方法名衔憨。
    3. 類名::示例方法名。
    4. 構(gòu)造方法引用:類名::new
Student student1 = new Student("zhangsan", 18);
        Student student2 = new Student("lisi", 20);
        Student student3 = new Student("wangwo", 22);
        Student student4 = new Student("xuebing", 16);
        List<Student> list = Arrays.asList(student1, student2, student3, student4);
        list.sort((studentParam1,studentParam2)->Student.compareStudentByScore(studentParam1,studentParam2));
        //上下這兩個(gè)排序等價(jià)袄膏,下面是上面的方法糖
        //1. 類名::靜態(tài)方法名
        list.sort(Student::compareStudentByScore);
        list.forEach(student -> System.out.println(student.getScore()));
        //2.引用名(對象名)::實(shí)類方法名践图。
        StudentCompare studentCompare = new StudentCompare();
        list.sort(studentCompare::compareByScore);
        list.forEach(student -> System.out.println(student.getScore()));
        //3.類名::示例方法名。
        list.sort(Student::compareByScore);
        //4.構(gòu)造方法引用:類名::new

Stream(流)

  • 流由3部分構(gòu)成:
    1. 零個(gè)或多個(gè)中間操作:中間操作都會(huì)返回一個(gè)Stream對象沉馆,例如:Stream<Student>码党,Stream<Integer>德崭。
    2. 終止操作:終止操作則不會(huì)返回Stream類型,可能不返回值揖盘,也可能返回其他類型的單個(gè)值眉厨。
  • 流操作的分類:
    1. 惰性求值
    2. 及早求值
        List<Integer> list = Arrays.asList(2, 4, 5, 6, 8);
        list.stream().map(i->i*2).forEach(integer -> System.out.println(integer));
        //給list中的每一個(gè)元素*2然后再相加操作
        //這是一個(gè)流:list是源,map是中間操作兽狭,reduce是終止操作
        System.out.println(list.stream().map(i -> i*2).reduce(0,Integer::sum));

Stream(流)的一些操作

 //一個(gè)流只能被操作一次 多次操作編譯報(bào)錯(cuò):Exception in thread "main" java.lang.IllegalStateException: stream has already been operated upon or closed
        Stream<String> stream = Stream.of("hello","nihap");
//        String[] strings = stream.toArray(length -> new String[length]);
        //等價(jià)于上面   這里使用方法引用
//        String[] strings1 = stream.toArray(String[]::new);
        //將stream轉(zhuǎn)化成list集合
        List<String> collect = stream.collect(Collectors.toList());
        collect.forEach(System.out::println);

        Stream<String> stream1 = Stream.of("hello","nihap","word");
//        List<String> collect1 = stream1.collect(Collectors.toList());
        ArrayList<String> collect1 = stream1.collect(() -> new ArrayList(), (theList, iteam) -> theList.add(iteam), (theList1, theList2) -> theList1.addAll(theList2));
        //下面的方法引用等價(jià)于上面的lambda表達(dá)式
        stream1.collect(ArrayList::new,ArrayList::add,ArrayList::addAll);
        collect1.forEach(item-> System.out.println(item));
        //將流轉(zhuǎn)化成LinkedHashSet以及其他....
        LinkedHashSet<String> collect2 = stream2.collect(Collectors.toCollection(LinkedHashSet::new));
        //將流對象轉(zhuǎn)化成String
        String collect3 = stream2.collect(Collectors.joining());
        //將集合中的元素轉(zhuǎn)化成大寫并輸出Map給一個(gè)元素對這個(gè)元素操作(加減乘除等...)之后返回一個(gè)新的元素
        list.stream().map(String::toUpperCase).collect(Collectors.toList()).forEach(item-> System.out.println(item));
        Stream<List<Integer>> listStream = Stream.of(Arrays.asList(1, 2), Arrays.asList(2, 3), Arrays.asList(4, 5));
        //flatMap的用法:將多個(gè)集合組成的流壓成一個(gè)流
        listStream.flatMap(theList->theList.stream()).map(item->item*item).forEach(integer -> System.out.println(integer));
        //通過Stream的generate靜態(tài)方法生成Stream對象憾股,然后輸出Stream流中的第一個(gè)元素
        Stream<String> stream1 = Stream.generate(UUID.randomUUID()::toString);
        stream1.findFirst().ifPresent(System.out::println);
        //構(gòu)造88個(gè)偶數(shù)放到Stream流中然后輸出2,4,8,16    n+1=n*n
        Stream.iterate(2,item->item*2).limit(88).forEach(System.out::println);
        Stream<Integer> stream3 = Stream.iterate(1, item -> item + 2).limit(6);
        //取出stream3中的大于2的元素,每一個(gè)乘以二箕慧,然后再提出前兩個(gè)元素服球,然后再取出前兩元素,然后去掉重復(fù)元素,然后再相加
        System.out.println(stream3.filter(itemIn -> itemIn > 2).mapToInt(item -> item * 2).skip(2).limit(2).distinct().sum());
        //Stream.summaryStatistics();返回IntSummaryStatistics對象包含了一些數(shù)字的結(jié)果(max销钝,min有咨,count。蒸健。座享。。)
        IntSummaryStatistics intSummaryStatistics = stream3.filter(itemIn -> itemIn > 2).mapToInt(item -> item * 2).skip(2).limit(2).distinct().summaryStatistics();
        System.out.println(intSummaryStatistics.getMax());
        System.out.println(intSummaryStatistics.getMin());
        System.out.println(intSummaryStatistics.getSum());
        System.out.println(intSummaryStatistics.getCount());
  • 內(nèi)部迭代:將n個(gè)條件拼接似忧,然后進(jìn)行循環(huán)查找渣叛。
    flatMap的用法
        List<String> list1 = Arrays.asList("hello ww", "hello ee", "qq hello");
        //flatMap:將多個(gè)stream打平放到一個(gè)stream中     (單詞去重)
        list1.stream().map(item->item.split(" ")).flatMap(Arrays::stream).distinct().collect(Collectors.toList()).forEach(System.out::println);

分組和分區(qū)的操作

        List<Student> students = Arrays.asList(student, student1, student2, student3);
        //根據(jù)Student的name進(jìn)行分組類似sql的group by
        Map<String, List<Student>> map = students.stream().collect(Collectors.groupingBy(Student::getName));
        Map<Integer, List<Student>> map1 = students.stream().collect(Collectors.groupingBy(Student::getScore));
        Map<String, Long> collect = students.stream().collect(Collectors.groupingBy(Student::getName, Collectors.counting()));
        Map<String, Double> collect1 = students.stream().collect(Collectors.groupingBy(Student::getName, Collectors.averagingInt(Student::getScore)));
        //對數(shù)據(jù)分區(qū)
        Map<Boolean, List<Student>> collect2 = students.stream().collect(Collectors.partitioningBy(student7 -> student7.getScore() > 80));

collect方法的詳細(xì)介紹:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市盯捌,隨后出現(xiàn)的幾起案子淳衙,更是在濱河造成了極大的恐慌,老刑警劉巖饺著,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件箫攀,死亡現(xiàn)場離奇詭異,居然都是意外死亡幼衰,警方通過查閱死者的電腦和手機(jī)靴跛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來渡嚣,“玉大人梢睛,你說我怎么就攤上這事∈兑” “怎么了绝葡?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵锣咒,是天一觀的道長脆侮。 經(jīng)常有香客問我,道長巩步,這世上最難降的妖魔是什么种蘸? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任墓赴,我火速辦了婚禮竞膳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘诫硕。我一直安慰自己坦辟,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布章办。 她就那樣靜靜地躺著锉走,像睡著了一般。 火紅的嫁衣襯著肌膚如雪藕届。 梳的紋絲不亂的頭發(fā)上挪蹭,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音休偶,去河邊找鬼梁厉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛踏兜,可吹牛的內(nèi)容都是我干的词顾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼碱妆,長吁一口氣:“原來是場噩夢啊……” “哼肉盹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起疹尾,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤上忍,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后纳本,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窍蓝,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年繁成,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了它抱。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡朴艰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出混移,到底是詐尸還是另有隱情祠墅,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布歌径,位于F島的核電站毁嗦,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏回铛。R本人自食惡果不足惜狗准,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一克锣、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧腔长,春花似錦袭祟、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鸟召,卻和暖如春胆绊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背欧募。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國打工压状, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人跟继。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓种冬,卻偏偏與公主長得像,于是被迫代替她去往敵國和親还栓。 傳聞我的和親對象是個(gè)殘疾皇子碌廓,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

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

  • 對于Java開發(fā)者來說,Java8的版本顯然是一個(gè)具有里程碑意義的版本剩盒,蘊(yùn)含了許多令人激動(dòng)的新特性谷婆,如果能利用好這...
    huanfuan閱讀 558評(píng)論 0 9
  • 對于Java開發(fā)者來說,Java8的版本顯然是一個(gè)具有里程碑意義的版本辽聊,蘊(yùn)含了許多令人激動(dòng)的新特性纪挎,如果能利用好這...
    jackcooper閱讀 1,025評(píng)論 0 6
  • 原創(chuàng)文章&經(jīng)驗(yàn)總結(jié)&從校招到A廠一路陽光一路滄桑 詳情請戳www.codercc.com 對于Java開發(fā)者來說,...
    你聽___閱讀 2,340評(píng)論 4 38
  • 歡迎交流java8新特性系列文章:http://www.reibang.com/nb/27231419 . [...
    DoubleBin閱讀 12,092評(píng)論 0 51
  • Java 8自Java 5(發(fā)行于2004)以來最具革命性的版本跟匆。Java 8 為Java語言异袄、編譯器、類庫玛臂、開發(fā)...
    huoyl0410閱讀 629評(píng)論 1 2