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

猜你喜欢

转载自www.cnblogs.com/mabaoying/p/12890355.html