Lambda表达式中方法引用的语法
当两者方法的结构一致的时候可以使用这种语法来简化Lambda表达式
1.对象的引用::实例方法名
2.类名::静态方法名
3.类名::实例方法名
4.类名::new(构造器引用)
5.类型[]::new(数组引用)
Lambda表达式的延迟执行(了解)?
是什么?
定义函数式接口,对普通方法进行改造;
为什么?
当我们在使用普通方法进行操作类似字符串拼接的时候,如果当方法里面的条件不满足的时候,程序依然会执行确认一次,这样就造成性能的浪费,而使用Lambda表达式可以拒绝这种性能浪费。
怎么做?
通过定义函数式接口的方式,去对方法进行改造,让方法在满足指定要求的情况下才进行操作,否则就不进行操作;
例如下面这行代码:在方法中,当条件不满足,也就是传入的参数不等于“info”的时候,就不会去调用get方法,因此就不会执行到拼接字符串的地方,也就更好的节约了资源,优化了性能;
public static void main(String[] args) {
String name = "张三";
String action="洗脚消费";
String money = "20000元";
// 延迟拼写字符串
logLambdaMethod("info",()->{
System.out.println("come in");
return name + action+ money;
});
}
private static void logLambdaMethod(String level, Supplier<String> sup) {
if ("info".equals(level)){
System.out.println("come in");
System.out.println(sup.get());
}
}
Stream流
是什么?
是支持数据处理操作的源生成的元素序列。
我的理解就是:流会像流水线车间一样,从源头出发,有各种不同的加工方法,这些加工方法目的明确,操作简便。
为什么?
例如我们每次要去操作类似数组或者集合里面的数据的时候,都需要重新写一个方法,这样十分不方便,因此为了解决这个问题就引出了Stream流
使用Stream流,我们只需要关注我们要做什么,而不用关心谁来做,更不关心怎么做
这样我们在开发过程中的目的就很明确,Stream流就可以很好的帮助我们更加快速的解决问题。
案例:
public static void main(String[] args) {
List<String> list = new ArrayList<>();
list.add("132");
list.add("11123");
list.add("124123");
list.add("125123");
list.add("125123");
//我们先演示一下不用Stream流,而用普通方法遍历集合,去操作我们想要得到的数据;
for (int i = 0; i <list.size() ; i++) {
if ("132".equals(list.get(i))){
System.out.println(i);
break;
}
}
List<String> list2 = new ArrayList<>();
for (int i = 0; i <list.size() ; i++) {
if (list.get(i).length()==3){
list2.add(list.get(i));
}
}
System.out.println(list2);
System.out.println("=====================");
//通过下面这个演示,可以直观的感受Stream流带给我们的方便
list.stream().filter(x->"132".equals(x)).forEach(System.out::println);
list.stream().filter(x->x.length()==5).forEach(System.out::println);
}
}
Stream流对象的创建
1.Collection的默认方法stream()和parallelStream();
2.Arrays.stream():集合转换为Stream流对象
3.Stream.of():括号里面是可变参数,转换为Stream流对象\
Stream流常用api
filter(predicate<T>p):根据lambda返回的boolean表达式的值去过滤(查找后进行处理)
distinct():去重,去除重复元素
limit(long n):保留前面n个元素
skip(long n):跳过前面n个数据
sorted():自然排序(默认从小到大);
allMatch:检查条件是否匹配所有元素;
anyMatch:检查条件是否至少匹配一个元素
noneMatch:检查是否没有匹配的元素,是则返回true
findFirst:返回第一个元素,返回的类型是Optional类型
count():返回流中元素的总共个数
max(Comparator<T>):返回流中的最大值,根据
min(Comparator<T>):返回流中的最小值
reduce:将流中元素挨个结合起来得到一个值
Optional类型
Optional也是Java8新特性的医院,它是一种容器,这个容器只存1个或者0个元素,它用于防止出现空指针异常;
常用api
isPresent:判断容器中是否有值
ifPresent(Consum lambda):容器如果不为空,则执行括号中的lambda表达式
T get:获取容器中的元素,如果容器为空则抛出NosuchElement异常
T orElse(T other):获取容器中的元素,若容器为空则返回括号中的默认值