zoukankan      html  css  js  c++  java
  • java8新特性学习一(Lambda表达式)

    java8新特性

    java8(又称为jdk1.8)是java语言开发的一个主要版本。java8是oracle公司于2014年3月发布,可以看成是自java5以来最具革命性的版本。java8位java语言、编译器、类库、开发工具与JVM带来了大量新特性。

    java8新特性简介

    速度更快

    代码更少(增加了新的语法:Lambda表达式)

    强大的Stream API

    便于并行

    最大化减少空指针异常:Optional

    Nashorn引擎,允许在JVM上运行JS应用

     为什么使用Lambda表达式

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

    Lambda表达式语法:

    Lmabda表达式:在java8语言中引入的一种新的语法元素和操作符。这个操作符为“->”,该操作符被称为Lambda操作符或箭头操作符。它将Lambda分为两个部分:

    左侧:指定了Lambda表达式需要的参数列表

    右侧:指定了Lambda体,是抽象方法的实现逻辑,也即Lambda表达式要执行的功能。

    Lambda表达式的使用(分为六种情况介绍):

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

     @Test
        public void test1(){
            Thread thread1=new Thread(new Runnable() {
                @Override
                public void run() {
                    System.out.println("---runable----");
                }
            });
            thread1.start();
            
            System.out.println("------------------------");
            
            Thread thread2=new Thread(()-> System.out.println("--lambda---"));
            thread2.start();
        }
    

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

     public void test2(){
            Consumer<String> consumer=new Consumer<String>() {
                @Override
                public void accept(String s) {
                    System.out.println(s);
                }
            };
            consumer.accept("测试");
    
            System.out.println("-------------");
    
            Consumer<String> consumer2=(String s)->{
                System.out.println(s);
            };
            consumer2.accept("lambda");
        }
    

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

    @Test
    public void test3(){
        Consumer<String> consumer1=(String s)->{
            System.out.println(s);
        };
        consumer1.accept("lambda");
    
        System.out.println("-------------");
    
        Consumer<String> consumer2=(s)->{
            System.out.println(s);
        };
        consumer2.accept("lambda类型推断");
        
        //我们常见的类型推断
        // List<String> list=new ArrayList<String>();
        List<String> list=new ArrayList<>();
        //int[] arry=new int[]{1,2,3};
        int[] arry={1,2,3}; 
    }

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

    @Test
        public void test4(){
            Consumer<String> consumer1=(s)->{
                System.out.println(s);
            };
            consumer1.accept("lambda类型推断");
    
            System.out.println("-------------");
    
            Consumer<String> consumer2=s->{
                System.out.println(s);
            };
            consumer2.accept("lambda一个参数省略小括号");
        }
    

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

        @Test
        public void test5(){
            Comparator<Integer> comparator1=new Comparator<Integer>() {
                @Override
                public int compare(Integer o1, Integer o2) {
                    System.out.println("o1==="+o1);
                    System.out.println("o2==="+o2);
                    return o1.compareTo(o2);
                }
            };
            System.out.println(comparator1.compare(31,22));
    
            System.out.println("-----------------");
    
            Comparator<Integer> comparator2=(o1,o2)->{
                System.out.println("o1==="+o1);
                System.out.println("o2==="+o2);
               return  o1.compareTo(o2);
            };
            System.out.println(comparator2.compare(11,22));
        }
    

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

    @Test
    public void test6(){
        Comparator<Integer> comparator1=(o1,o2)->{
            return  o1.compareTo(o2);
        };
        System.out.println(comparator1.compare(11,22));
        
        System.out.println("-----------------");
        
        Comparator<Integer> comparator2=(o1,o2)->o1.compareTo(o2);
        System.out.println(comparator1.compare(33,22));
    
        System.out.println("************************");
        Consumer<String> consumer1=s->{
            System.out.println(s);
        };
        consumer1.accept("lambda一个参数省略小括号");
        
        System.out.println("===================");
        
        Consumer<String> consumer2=s->System.out.println(s);
        consumer1.accept("lambda只有一条语句省略大括号");
    }

    总结

    ->左边:lambda形参列表的参数类型可以省略(类型推断);如果lambda形参列表只有一个参数,其一对()可以省略。

    ->右边:lambda体应该使用一对大{};如果lambda体只有一条执行语句(可能是return语句),省略这一对大{}和return。

    Lambda表达式的本质:作为接口的实例,接口的要求符合函数式接口。

  • 相关阅读:
    使用JDBC连接MySql时出现:The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration
    Mysql Lost connection to MySQL server at ‘reading initial communication packet', system error: 0
    mysql-基本命令
    C# 监听值的变化
    DataGrid样式
    C# 获取当前日期时间
    C# 中生成随机数
    递归和迭代
    PHP 时间转几分几秒
    PHP 根据整数ID,生成唯一字符串
  • 原文地址:https://www.cnblogs.com/mabaoying/p/12890355.html
Copyright © 2011-2022 走看看