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