Lambda表达式和Stream流

文章介绍了Java8中的Lambda表达式,包括方法引用的五种形式,以及如何通过Lambda实现延迟执行以优化性能。同时,文章详细阐述了Stream流的概念,解释了其作为数据处理流水线的优势,并通过案例展示了Stream如何简化集合操作。最后提到了Optional类型,这是一种避免空指针异常的容器类。
摘要由CSDN通过智能技术生成

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):获取容器中的元素,若容器为空则返回括号中的默认值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Strine

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值