首页 > 编程语言 >1.Java8新特性

1.Java8新特性

时间:2023-11-17 22:45:26浏览次数:40  
标签:name list 特性 o2 new Java8 表达式 Lambda

1.Lambda表达式

 1.1 概述

  Lambda表达式是一种函数式编程函数编程思想)方式,用于替代匿名内部类。它使得代码更具有可读性和简洁性,并提供更好的代码复用性和可维护性

面向对象编程思想

  强调的是对象必须通过对象来完成操作,情况较复杂。例如:多线程执行任务,需要创建对象。首先定义一个实现类实现接口Runnable,然后重写run方法中的代码传递给线程对象,这么麻烦?直接执行不就好了吗?

函数编程思想

  函数需要得有输入量输出量,使用输入量计算得到输出量。为了尽量忽略对象的复杂用法---强调做什么,而不是以什么去做。

  同样执行线程任务,使用函数编程思想,可以直接通过传递一段代码给线程对象执行不需要创建任务对象

小结函数编程思想可以通过一段代码完成面向对象想要做的代码量

1.2 Lambda表达式格式

1.2.1 标准格式

(参数列表)->{代码}

1.2.2 格式说明

  1. 小括号内的语法与接口中的方法括号里面的参数列表一致,空参数则空,多个参数逗号(",")隔开;
  2. ->新引入的语法格式,表示指向动作;
  3. 大括号内的内容与接口实现类中方法体的内容一致

1.2.3 代码实例

public static void main(String[] args) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("第一种创建线程方式");
            }
        }).start();
        
        new Thread(()->{
            System.out.println("更简洁地方法创建多线程");
        }).start();
    }

运行结果

  在上述代码中,我们可以看到使用lambda表达式,省去了创建接口的流程(new Runnable),连里面的方法(run()方法)都省去只保留方法中的内容

List<Integer> list = new ArrayList<>();
        //为列表一次性添加多个元素
        Collections.addAll(list, 11,22,33,44,55);
        System.out.println(list);
        //比较器的正常书写格式
        Collections.sort(list, new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o2 - o1;//后面数减前面数是降序排列
            }
        });
        System.out.println(list);
        //lambda表达式
        Collections.sort(list,(Integer o1, Integer o2)->{ return o1 -o2;});//前面数减后面数是升序排列
        System.out.println(list);

运行结果

1.3 Lambda表达式使用的条件

  首先,都是接口,且接口中只有一个抽象方法才可以使用Lambda表达式

  1. 接口中只有一个抽象方法,叫函数式接口
  2. 如果是函数式接口,可以用@FunctionInterface注解标识

   在上图中,Runnable是一个接口,其只有一个抽象方法,且被@FunctionInterface注解标识,只需满足其中一个就可以使用Lambda表达式。

1.4 Lambda 表达式的简写格式

  1. 小括号中的形参类型可以省略
  2. 如果小括号中只有一个参数的话,那么小括号可以省略
  3. 如果大括号中只有一条语句,那么大括号、分号、return可以一起省略
new Thread(()->System.out.println("更简洁的线程创建")).start();
运行结果
更简洁的线程创建
//继续简化lambda表达式
        Collections.sort(list, (o1, o2)->o2-o1);

运行结果
[55, 44, 33, 22, 11]

1.5 Lambda表达式的表现形式

1.变量的形式:变量为函数式接口,就么可以复制一个Lambda表达式【不常用】

        // 变量的形式
        Runnable r = ()->{
            System.out.println("任务代码");
        };
        // 函数式接口类型的变量
        Thread t = new Thread(r);

2.参数的形式:方法的形参为函数式接口,就可以传入一个Lambda表达式【常用】

        // 变量的形式-比较器
        Comparator<Integer> comparable = (o1, o2)->{return o2 - o1;};
        // 创建集合
        ArrayList<Integer> list = new ArrayList<>();
        // 存入数据
        Collections.addAll(list,11,22,33,44,55);
 
        // 将函数式接口类型  的 形参类型,传给Collections
        Collections.sort(list,comparable);

3.返回值的形式:方法的返回值类型为函数式接口,就可以返回一个Lambda表达式【常用】

        // 定义一个方法
        public static Comparator<Integer> getComparator(){
            return (Integer o1,Integer o2)->{return  o2-o1;};
        }
        
        public static void main (String[] args) {
            // 返回值形式
            Collections.sort(list,getComparator());
        }

2.Stream流

  Stream流是一种用于处理集合数据进行数据操作API。它提供了一种简单而强大的方法,可以以声明式的方式对集合进行过滤映射排序分组等操作。

2.1 Stream流引入

问题

  1. 将list集合中姓张的元素过滤到一个新的集合中
  2. 然后将过滤出来的姓张的元素中,再过滤出来长度为3的元素,存储到一个新的集合中

代码实例

//①将list集合中姓张的元素过滤到一个新的集合中
        //②然后将过滤出来的姓张的元素中,再过滤出来长度为3的元素,存储到一个新的集合中
        List<String> list = new ArrayList<>();
        Collections.addAll(list, "张老三", "张小三", "李四", "王五", "张六", "赵八");
        List<String> list1 = new ArrayList<>();
        for (String name:list) {
            if (name.startsWith("张")){
                list1.add(name);
            }
        }
        System.out.println(list1);
        List<String> list2 = new ArrayList<>();
        for (String name:list1) {
            if (name.length() == 3){
                list2.add(name);
            }
        }
        System.out.println(list2);
普通方法

运行结果

[张老三, 张小三, 张六]
[张老三, 张小三]

用Stream流操作集合,获取流,过滤操作,打印输出

list.stream().filter((String name)->name.startsWith("张"))
                //方法体中只有一个形参时可省略小括号,方法体中只有一个语句时可省略大括号
                    .filter(name -> name.length() == 3)
                    //遍历
                    .forEach(name -> System.out.println(name));

运行结果

张老三
张小三

 

标签:name,list,特性,o2,new,Java8,表达式,Lambda
From: https://www.cnblogs.com/kzf-99/p/17839002.html

相关文章

  • Java面向对象三大特性之多态及综合练习
     1.1多态的形式多态是继封装、继承之后,面向对象的第三大特性。多态是出现在继承或者实现关系中的。多态体现的格式:父类类型变量名=new子类/实现类构造器;变量名.方法名();多态的前提:有继承关系,子类对象是可以赋值给父类类型的变量。例如Animal是一个动物类型,而Cat是一个猫类......
  • 属性设置了configurable:false,表示该属性不可删除,删改无效,也不可再次修改其特性,但是属
    执行以下程序,下列选项中,说法正确的是()varobj={brand:'华为',price:1999};Object.defineProperty(obj,'id',{value:1})Object.defineProperty(obj,'price',{configurable:false})console.log(Object.keys(obj).length);...①for(varkinobj){con......
  • java8 stream api流式编程
    ......
  • Java8中Optional类的认识和用法
       Optional在Java8中引入,目的是解决 NullPointerExceptions的问题。它可以保存类型T的值,代表这个值存在。或者仅仅保存null,表示这个值不存在。原来用null表示一个值不存在,Optional可以更好的表达这个概念。并且可以避免空指针异常。这样我们就不用显式进行空值检测......
  • .NET8依赖注入新特性Keyed services
    什么是KeyedserviceKeyedservice是指,为一个需要注入的服务定义一个KeyName,并使用使用KeyName检索依赖项注入(DI)服务的机制。使用方法通过调用AddKeyedSingleton(或AddKeyedScoped或AddKeyedTransient)来注册服务,与KeyName相关联。或使用[FromKeyedServices]属性指......
  • 流倒序排序_java8 stream多字段排序
      //返回对象集合以类属性一升序排序list.stream().sorted(Comparator.comparing(类::属性一));//返回对象集合以类属性一降序排序注意两种写法list.stream().sorted(Comparator.comparing(类::属性一).reversed());//先以属性一升序,结果进行属性一降序list.stream()......
  • ASP.Net MVC使用特性路由
    ASP.NETMVC中使用特性路由需要在默认路由前调用routes.MapMvcAttributeRoutes();需要注意Action上使用特性路由时需要注意不能以/开头不能写成/Controller/Action如果使用了routes.MapMvcAttributeRoutes();出现不能调用控制器“xx”上的操作方法“xx”,因为该方法是一种泛......
  • 记录jdk17相对于jdk8增加的一下主要语法糖和新特性
    jdk17发布已经好久了,作为java的长期支持版本,引入了许多有趣且实用的新特性。这些特性不仅提高了开发效率,还增强了语言的表现力和安全性。并且是SpringBoot3.0以后版本的硬性要求,之后势必会是java开发的主要版本。经过我个人的测试体验,在Java17环境中运行使用早期Ja......
  • 数据库事务是什么?事务的四大特性是什么?
    数据库事务是什么?事务的四大特性是什么?1.数据库事务事务是一组原子性的SQL语句,或者说一个独立的工作单元。如果数据库引擎能够成功地对数据库应用该组操作的全部语句,那么就执行该组查询。如果其中任何一条语句因为崩溃或其他原因无法执行,那么所有的语句都不会执行。也就是说,......
  • Springboot3核心特性
    一、简介1.前置知识Java17Spring、SpringMVC、MyBatisMaven、IDEA2.环境要求环境&工具版本(orlater)SpringBoot3.0.5+IDEA2021.2.1+Java17+Maven3.5+Tomcat10.0+Servlet5.0+GraalVMCommunity22.3+......