47. java8 新特性--Lambda表达式 / 方法引用

本文详细介绍Java 8引入的关键特性,包括Lambda表达式的简洁语法、强大的Stream API用于高效操作集合,以及Optional类减少空指针异常。通过实例演示如何利用这些特性简化代码和提高并发性能。
摘要由CSDN通过智能技术生成

java8 新特性

在这里插入图片描述特点:

  • 速度更快
  • 代码更少(增加了新的语法: Lambda 表达式)
  • 强大的 Stream API
  • 便于并行
  • 最大化减少空指针异常: Optional
  • Nashorn引擎,允许在JVM上运行JS应用

一、Lambda表达式

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

/**
 * @author eden
 * @Description
 *   左 -> 右  :(s1, s2) -> s1.compareTo(s2)
 *   ->:lambda操作符
 *   左边表示的是lambda形参列表
 *   右边表示的是lambda体:重写的抽象方法的方法体
 *  语法格式见下述demo
 *
 * @create projectTest-com.senior.newtest:2021-05-15-12:43
 * @since
 */
public class NewTest {
    //Lambda语法格式
    @Test
    public void lambdaTest(){
        //语法格式一: 无参,无返回值
        Runnable r1 = () -> System.out.println("Lambda语法格式一");
        r1.run();
        //语法格式二: Lambda 需要一个参数,但是没有返回值
        Consumer<String> c1 = (String s) -> { System.out.println(s);};
        c1.accept("test2语法格式二");
        //语法格式三: 数据类型可以省略,因为可由编译器推断得出,称为“类型推断”
        Consumer<String> c2 = (s) -> { System.out.println(s);};
        c2.accept("test3语法格式三");
        //语法格式四: Lambda 若只需要一个参数时, 参数的小括号可以省略
        Consumer<String> c3 = s -> { System.out.println(s);};
        c3.accept("test4语法格式四");
        //语法格式五: Lambda 需要两个或以上的参数,多条执行语句,并且可以有返回值
        Comparator<Integer> com = (x,y) -> {
            System.out.println("test4语法格式四");
            return Integer.compare(x,y);
        };
        System.out.println(com.compare(44,43));
        //语法格式六: 当 Lambda 体只有一条语句时, return 与大括号若有,都可以省略
        Comparator<Integer> com1 = (x,y) ->  Integer.compare(x,y);
        System.out.println(com1.compare(12, 54));


    }

    @Test
    public void test(){
        new Runnable() {
            @Override
            public void run() {
                System.out.println("runable 的方法");
            }
        }.run();

        System.out.println("=========");

        Runnable r = () -> System.out.println("test lambda");
        r.run();

        Comparator<Integer> com = (i1, i2) -> Integer.compare(i1,i2);
        int compare = com.compare(12, 23);

        Comparator<String> com1 = (s1, s2) -> s1.compareTo(s2);
        int compare1 = com1.compare("name","nama");
        System.out.println(compare1);

    }
}

只包含一个抽象方法的接口叫做函数式接口

可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda 表达式抛出一个受检异常(即:非运行时异常),那么该异常需要在目标接口的抽象方法上进行声明)。
可以在一个接口上使用 @FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口。同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

    //根据某种规则过滤String List
    @Test
    public void test1()
    {
        List<String> strs = Arrays.asList("MIT","Oxford","Standard","TsingHua");


        List<String> stringList = filterString(strs, s -> {
            return s.contains("ing");
        });
        System.out.println(stringList);

    }
    //根据某种规则过滤String List
    public List<String> filterString(List<String> strs, Predicate<String> pre){
        ArrayList<String> arrayList = new ArrayList<>();

        for(String s:strs)
        {
            if(pre.test(s))
            {
                arrayList.add(s);
            }
        }
        return arrayList;
    }

方法引用

当要传递给Lambda体的操作,已经有实现的方法了,可以使用方法引用!

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

构造器引用

        //构造器引用
        //Function<T,R> R是我们想要创建的类的对象,T是该类构造器的输入参数
        //String类中提供了一个构造器是public String(char value[])
        Function<char[], String> fun1 = String::new;
        
        String str = "PhD";
        char[] chars = new char[5];
        chars = str.toCharArray();
        
        String test = fun1.apply(chars);
        System.out.println(test);

数组引用

        Function<Integer,Integer[]> fun = Integer[]::new;
        Integer[] apply = fun.apply(5);
        System.out.println(apply.length);
        apply[0] = 1;
        for(Integer i:apply)
        {
            System.out.println(i);
        }

该博客图片来源于尚硅谷宋老师教学课件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值