首页 > 编程语言 >Java8新特性lambda学习

Java8新特性lambda学习

时间:2023-11-21 20:34:55浏览次数:38  
标签:compare System 特性 o2 println Java8 o1 lambda

Lambda表达式

Lambda是一个匿名函数,我们可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。使用它可以写出更简洁、更灵活的代码。作为一种更紧凑的代码风格,使Java的语言表达能力得到了提升。
本质: 作为函数式接口的实例, 没有接口就没意义了.

    // 简单使用举例
    @Test
    public void test1(){
        Runnable r1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("r1 is running...");
            }
        };
        r1.run();
        // lambda写法
        Runnable r2 = () -> System.out.println("r2 is running...");
        r2.run();
    }

    @Test
    public void test2(){
        Comparator<Integer> intcmp = new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return Integer.compare(o1, o2);
            }
        };
        System.out.println(intcmp.compare(1, 2));
        Comparator<Integer> intcmp2 = Integer::compare; // 方法引用
        // 和intcmp2等价, 但lambda
        Comparator<Integer> intcmp3 = (Integer o1, Integer o2) -> Integer.compare(o1,o2);
        // 和intcmp2等价, 但lambda
        Comparator<Integer> intcmp4 = (o1, o2) -> Integer.compare(o1,o2);
        System.out.println(intcmp2.compare(2, 1));
        System.out.println(intcmp3.compare(2, 1));
        System.out.println(intcmp4.compare(2, 1));
    }

这两个代码片段分别创建了匿名内部类的实例,分别用于实现Comparator<Integer>接口和Runnable接口。
当接口只有一个抽象方法时(函数式接口)用lambda改写会更简洁. 在实际开发中,通常更倾向于使用Lambda 表达式,因为它使代码更简洁且易读。

操作符解释以及lambda的6种语法格式

-> : lambda操作符
-> 左边: lambda形参列表, 其实就是接口中的抽象方法中的形参列表
-> 右边: lambda体, 其实就是重写的抽象方法的方法体

语法格式一: 无参, 无返回值

Runnable r2 = () -> System.out.println("r2 is running...");

语法格式二: 一个参数, 无返回值

Consumer<String> cons2 = (String s) -> System.out.println(s);
cons2.accept("cons2");

语法格式三: 数据类型可以省略, 因为可由编译器推断得出, 称为'类型推断'

Comparator<Integer> intcmp4 = (o1, o2) -> Integer.compare(o1,o2);
Consumer<String> cons2 = (s) -> System.out.println(s);

语法格式四: lambda若只需要一个参数, 参数的小括号可以省略

Consumer<String> cons2 = s -> {System.out.println(s);};

语法格式五: lambda需要两个或以上的参数, 多条执行语句, 并且可以有返回值

Comparator<Integer> intcmp5 = (o1, o2) -> {
    System.out.println("intcomp5");
    return Integer.compare(o1, o2);
};
System.out.println(intcmp5.compare(2, 3));

语法格式六: lambda只有一条语句, return与大括号若有, 都可以省略

Comparator<Integer> intcmp4 = (o1, o2) -> Integer.compare(o1,o2);

总结

-> 左边: lambda形参列表的参数类型可以省略(因为有类型推断); 如果lambda形参列表只有一个参数, 括号()也可以省略;
-> 右边: lambda体应该用一对{}包裹; 如果lambda体只有一条执行语句(可能是return 语句), 可以省略这一对{}和return关键字.

标签:compare,System,特性,o2,println,Java8,o1,lambda
From: https://www.cnblogs.com/joey-redfield/p/17847511.html

相关文章

  • postgresql 16主要新特性
    继postgresql15新特性后,pg16已经发布,这个版本的主要特性如下:1、逻辑复制支持级联,不一定要从primary开始;2、逻辑复制支持订阅自己,也就是真正的双主可以通过逻辑复制内置订阅实现了,不需要依赖三方,如pglogical3、copy性能提升明显,某些场景下300%4、SIMD支持数组和json、子事务搜......
  • .NET8 Blazor新特性 流式渲染
    什么是SSRBlazor中的流式渲染结合了SSR(服务端渲染),服务端将HTML拼好返回给前端,有点像我们熟知的RazorPages或MVC。当已经有了RazorPages或MVC时,为什么还要选择使用Blazor来实现这一点?这里有几个原因。首先,RazorPages和MVC没有像Blazor这样提供了很好的可重用组......
  • 1.Java8新特性
    1.Lambda表达式 1.1概述Lambda表达式是一种函数式编程(函数编程思想)方式,用于替代匿名内部类。它使得代码更具有可读性和简洁性,并提供更好的代码复用性和可维护性。面向对象编程思想:强调的是对象,必须通过对象来完成操作,情况较复杂。例如:多线程执行任务,需要创建对象。......
  • Java面向对象三大特性之多态及综合练习
     1.1多态的形式多态是继封装、继承之后,面向对象的第三大特性。多态是出现在继承或者实现关系中的。多态体现的格式:父类类型变量名=new子类/实现类构造器;变量名.方法名();多态的前提:有继承关系,子类对象是可以赋值给父类类型的变量。例如Animal是一个动物类型,而Cat是一个猫类......
  • JavaSE day08 - Lambda,Stream,File,递归
    JavaSEday08-Lambda,Stream,File,递归今日目标Lambda表达式Stream流File类递归1Lambda表达式1.1体验Lambda表达式packagecom.itheima.lambda_demo;/*Lambda表达式体验:*/publicclassLambdaDemo{publicstaticvoidmain(String[]ar......
  • 属性设置了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()......