一、lambda表达式
格式:()-> { 方法体 }
方法的参数或局部变量类型是函数式接口(有且仅有一个抽象方法),
@FunctionalInterface 函数式接口检验

1、Collections.sort(List list,Comparato c),根据上面的规则

2、用匿名内部类Runnable接口作为参数开启一个线程,可以精简

3、小结,黑马JDK8新特性的b站视频

二、新增四个函数式接口,一开始觉得没啥用,后来想应该是解耦合以及实现代码复用
- Supplier:生产者,有一个get方法
- Consumer:消费者,有accept方法和andThen()
- Function:apply方法,传一个类型的值,返回另一个类型的值,也有andThen,compose 方法(应该是执行先后的问题,源码里一个before,一个after),还有identity方 法(返回本身??)
- Predicate:test方法,做判断用,返回boolean类型
三、接口新增default方法 static 方法
- A、因为一个接口有很多实现类,比如Map,要是新增一个方法,所有实现类都会 报错,都需要重写这个方法,所以新增默认方法,方便方法的扩展。
B、方式一:实现类可以直接调用
方式二:实现类可以重写
- static方法不能用实现类的实例调用,直接 接口名.method()调用,也可以给接口 其他方法使用
- 静态方法和默认方法的区别 + 小结

四、集合的Stream流式操作
1、回顾 map 的四种遍历方式
public void test(){
Map<String,Integer> map = new HashMap<>();
map.put("张三",14);
map.put("张1",15);
map.put("张2",17);
map.put("张3",13);
Set<String> set = map.keySet();
set.stream().forEach(s-> System.out.println(s));
Collection<Integer> collection = map.values();
collection.stream().forEach(s-> System.out.println(s));
Set<Map.Entry<String, Integer>> set1 = map.entrySet();
set1.stream().forEach(s-> System.out.println(s));
for (Map.Entry<String,Integer> me : map.entrySet()){
System.out.println(me.getKey()+" "+me.getValue());
}
}
2、 a、获取流的方式一:集合对象 . stream();map 的话按上面获取集合形式
b、获取流的方式二:基本数据类型和引用数据类型数组有区别
可以看到,基本数据类型数组是作为一个元素进行操作

3、小结,常用方法和注意事项

方法补充:
a、distinct方法可以直接去重,面试当时问到还不会
b、match(allMatch anyMatch nonematch , 全满足,任一满足,全部满足)返回 boolea类型
c、find(findFirst findAny)一样的查找第一个
d、sort 空参:默认排序,可以里面加 new Comparator接口自定义排序
e、max 和 min 方法:查找最大值 \ 最小值,需要加Comparator自定义排序,查找 出来是Optional类型的值,直接输出 String.format("Optional[%s]", value),不想 要可以用max.get()
f、reduce:传两个参数,返回一个值,能获取上一次的结果并进行操作
g、map 和 reduce 组合使用,可以将一个类型的转换类型并操作,比如对象转为 对象的属性然后对属性进行操作
examp:比如统计一串字符中某个字符出现的次数,可以用filter过滤然后 count;或者用map将等于的变为1,不等的变为0,然后reduce相加
h、mapToInt,因为泛型里都是Integer包装类,操作会涉及装箱和拆箱,转为int 类型的话,会节省内存,用mapToInt(Integer::intValue),类名::方法名
i、静态 Stream.concat 合并两个流,注意,合并后原先的流不能进行操作,不同 同类型的也可以
4、将结果收集成集合或者数组
a、集合:stream.collect(Collectors.toCollection(ArrayList(或别的)::new))如果是set、map类型,会自动去重,否则是List或Set(Collectors.toList(Set))
b、数组:stream.toArray(String[](或别的类型,否则是Object[])::new);
后面还有好多,以后感兴趣再看...............................
本文深入介绍了Java 8的三大核心特性:Lambda表达式,包括其语法、应用场景;新增的四个函数式接口,如Supplier、Consumer、Function和Predicate及其方法;以及接口的default和static方法,解释了它们的作用和使用方式。此外,文章详细探讨了集合的Stream流式操作,列举了多种遍历方式,并重点讲解了distinct、match、find、sort、reduce、mapToInt等方法的使用,以及如何通过map和reduce组合进行数据处理。最后,提到了如何将流式操作的结果收集为集合或数组。
901





