Predicate:Predicate是個(gè)函數(shù)式接口额衙,和Function接口一樣免绿,不同的是Predicate接口的定義為Predicate<T,Boolean>山孔,也就是Predicate接口定義了接受一個(gè)類型為T的參數(shù)狞贱,返回一個(gè)boolean類型的結(jié)果澈缺。
使用實(shí)例:
Student stu=new Student("A",3);
Predicate<Student> predicate=s -> stu.getName.equals("A");
System.out.println(predicate.test(stu));//返回結(jié)果為true
Stream:Stream是以一種流式處理的思想對(duì)集合的元素進(jìn)行處理草戈。
使用實(shí)例:
List<Student> list=new Arraylist<Student>();
Student aa=new Student("E",3);
list.add(new ?Student("A",1));
list.add(new ?Student("B",2));
list.add(new ?Student("D",4));
list.add(new ?Student("C",3));
list.add(aa);
list.add(aa);
1.過(guò)濾年齡>1的Student:
List<Student> list1=list.stream().filter(s ->s.getAge>1).collect(Collectors.toList());
list1.forEach(stu ->{
System.out.println("stu"+stu.getName()+":"+stu.getAge());
});
2.過(guò)濾排序
List<Student> list1=list.stream().filter(s ->s.getAge>1).sorted((stu1,stu2) ->stu1.getAge()-stu2.getAge()).distinct().skip(2).collect(Collectors.toList());
distinct() 無(wú)參數(shù)塌鸯,過(guò)濾Stream中的重復(fù)元素,得到是無(wú)重復(fù)元素的Stream唐片,重復(fù)元素的依據(jù)是元素的equals方法
peek(Consumer) peek接收的參數(shù)為Consumer類型丙猬,Consumer在之前講到過(guò)接收一個(gè)T類型參數(shù),無(wú)返回值费韭,這是peek方法和map方法的主要區(qū)別茧球,peek用來(lái)處理無(wú)返回值的操作,比如打印元素星持,而map用來(lái)處理有返回值的操作抢埋。
sorted() 和上面的帶參數(shù)的sorted一樣,只不過(guò)這個(gè)無(wú)參數(shù)督暂,按照對(duì)象自定義的Comparator接口實(shí)現(xiàn)揪垄。如果對(duì)象未實(shí)現(xiàn)Comparator接口會(huì)報(bào)錯(cuò)。
skip(long) 跳過(guò)Stream中的前n個(gè)元素损痰,如果Stream元素個(gè)數(shù)小于n福侈,返回空的stream
limit(long) 獲取Stream中的前n個(gè)元素,如果Stream元素個(gè)數(shù)小于n卢未,返回全部元素
Optional:
Optional.ofNullable(T t) 獲取一個(gè)內(nèi)部元素為t的Optional對(duì)象肪凛,t如果為空,則返回空的Optional對(duì)象
ifPresent(Consumer) 判斷一個(gè)Optional內(nèi)部的元素是否為空辽社,為空不執(zhí)行consumer伟墙,不為空會(huì)執(zhí)行consumer
orElseGet(Supplier) 嘗試從Optional中獲取其元素,如果Optional為空滴铅,則執(zhí)行Supplier函數(shù)提供一個(gè)元素返回戳葵,否則返回Optional中的元素
使用實(shí)例:
Student aa1=new Student("H",7);
Optional.ofNullable(aa1).orElseGet(() -> {
? ? ? ? return null;
});
Optional.ofNullable(aa1).ifPresent(
stp -> { system.out.println("sss");}
);
集合轉(zhuǎn)換:
1.List轉(zhuǎn)set:
Set<Student> set=list.stream().collect(Collectors.toSet());
2.List轉(zhuǎn)map
Map<Integer,Object> map=list.stream().collect(Collectors.toMap(Student::getAge,Student -> Student,(stu1,stu2)-stu2));//其中的 (stu1, stu2) -> stu2 表示當(dāng)遇到重復(fù)元素時(shí)保留新的值
我們?nèi)绻M?dāng)遇到重復(fù)的key時(shí)判斷name的長(zhǎng)度,name較長(zhǎng)的保留汉匙,則可以寫成下面的方式:
.collect(Collectors.toMap(stu -> stu.getAge(), stu -> stu,
? ?(stu1, stu2) -> stu1.getName().length() > stu2.getName().length() ? stu1 : stu2));
3.按照年齡分組:
Map<Integer,List<Student>> maplist=list.stream().collect(Collectors.groupingBy(Student::getAge));
maplist.foreach((k,v) ->{
System.out.println("k:"+k+"v:"+v);
})
4.獲取名稱列表
List<String> namelist=list.stream().map(Student -> Student.getName()).collect(Collectors.toList());
5.使用lambda表達(dá)式簡(jiǎn)化4
List<String> namelist=list.stream().map(Student::getName).collect(Collector.toList());
6.replaceAll
List<String> list=Arrays.asList("111-222-333“,”444-555-666");
list.replaceAll(temp -> temp.replace("-",""));
7.merge
Map<String,String> map=new HashMap<String,String>();
map.put("ss","ss");
map.merge("ss","hh",String::concat);