java8新特性_03_Lambda表达式基础语法

 

目录

Lambda 表达式语法(对接口的实现)

语法格式

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

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

//语法格式三:若只有一个参数,小括号可以不写

//语法格式四:有多个参数,有返回值,Lambda体中有多条语句

//语法格式五:Lambda体中只有一行语句,return和大括号可以不写

//语法格式六:Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器可以通过上下文推断出数据类型,即“类型推断”

函数式接口


Lambda 表达式语法(对接口的实现)

Lambda 是一个匿名函数,可以把Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以写出更简洁、更灵活的代码。

Java8引入了一个新的操作符 “->” 该操作符称为箭头符或lambda 操作符,箭头操作符将 Lambda 表达式拆分成两部分:
左侧:Lambda 表达式的参数列表;
右侧:Lambda 表达式中所需要执行的功能,即 Lambda 体;

语法格式

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

Runnable r1 = () -> { System.out.println("hello Lambda"); };

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

Consumer c = (x) ->{System.out.println(x); };

//语法格式三:若只有一个参数,小括号可以不写

Consumer con = x ->{System.out.println(x); };

//语法格式四:有多个参数,有返回值,Lambda体中有多条语句

Comparator<Integer> com = (x,y)->{

System.out.println("函数式接口");

return Integer.compare(x,y);

};

//语法格式五:Lambda体中只有一行语句,return和大括号可以不写

Comparator<Integer> c = (x,y)-> Integer.compare(x,y);

//语法格式六:Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器可以通过上下文推断出数据类型,即“类型推断”

Comparator<Integer> c = (Integer x,Integer y)-> Integer.compare(x,y);

Comparator<Integer> c2 = (x,y)-> Integer.compare(x,y);

上联:左右遇一括号省

下联:左侧推断类型省

横批:能省则省

public class TestLambda2 {

    //语法格式一:无参,无返回值
    @Test
    public void test01(){

        int num = 0;//JDK1.7前,必须是final,1.8不用加,但本质上还是final
        //内部类写法
        Runnable r = new Runnable() {
            @Override
            public void run() {
                System.out.println("hello world"+num);
            }
        };
        r.run();
        System.out.println("===============================");
        //Lambda写法
        Runnable r1 = () -> { System.out.println("hello Lambda"); };
        r1.run();
    }

    //语法格式二:有一个参数,无返回值
    @Test
    public void test02(){
        Consumer c = (x) ->{System.out.println(x); };
        c.accept("有一个参数,无返回值");

        System.out.println("=================================");
        //语法格式三:若只有一个参数,小括号可以不写
        Consumer con = x ->{System.out.println(x); };
        con.accept("若只有一个参数,小括号可以不写");
    }

    //语法格式四:有多个参数,有返回值,Lambda体中有多行代码
    @Test
    public void test03(){
        Comparator<Integer> com  = (x,y)->{
            System.out.println("函数式接口");
            return Integer.compare(x,y);
        };
        System.out.println("================");
        //语法格式五:Lambda体中只有一行语句,return和大括号可以不写
        Comparator<Integer> c  = (x,y)-> Integer.compare(x,y);
    }

    //语法格式六:Lambda表达式的参数列表的数据类型可以省略不写,因为JVM编译器可以通过上下文推断出数据类型,即“类型推断”
    @Test
    public void test04(){
        //语法格式五:Lambda体中只有一行语句,return和大括号可以不写
        Comparator<Integer> c  = (Integer x,Integer y)-> Integer.compare(x,y);
        Comparator<Integer> c2  = (x,y)-> Integer.compare(x,y);
    }
    
    //类型推断
    @Test
    public void test05(){
        String[] s = {"aaa","bbb","bbb"};
        //无法完成类型推断
        //String[] str;
        //str = {"aaa","bbb","bbb"};
        List<String> list = new ArrayList<>();
        //类型推断,无需写出Map里面的参数类型(1.8)
        show(new HashMap<>());
    }

    public void show(Map<String, Integer> map){

    }
}

函数式接口

使用 Lambda 表达式需要函数式接口的支持;
函数式接口:接口中只有一个抽象方法(Object类中的方法忽略)。或者使用了@FunctionInterface 注解的接口,为函数式接口。

//定义一个函数式接口
@FunctionalInterface
public interface MyFun {
    public Integer getValue(Integer num);
}

//需求:对一个数进行运算

@Test
public void test06(){
    System.out.println(operation(100,num -> num*num));
}

//使用了策略设计模式   
public Integer operation(Integer num, MyFun mf){
    return mf.getValue(num);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值