• 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表达式的本质:作为接口的实例,接口的要求符合函数式接口。

  • 相关阅读:
    Java面向对象编程之异常处理机制
    LinkedList链式集合
    Java之反射机制
    适配器模式
    QuickHit
    Java之单例模式
    Java面向对象之接口
    多线程
    线程同步
    试题分析
  • 原文地址:https://www.cnblogs.com/mabaoying/p/12890355.html
Copyright © 2020-2023  润新知