Lambda表达式

1.java8新特性 : 函数式接口

什么是函数式接口?

  • 只包含一个抽象方法的接口称为函数式接口.该接口可以包含其他非抽象方法.
  • 可以通过lambda表达式创建该接口的实现类的对象.(lambda表达式抛出受检异常,那么该异常需要在目标接口的抽象方法上进行声明)
  • 我们可以在抽象方法上使用注解,这样做可以检查是否是函数式接口.
  • 在java.util.function包下,定义了java8丰富的函数式接口.

2.冗余的匿名内部类与简洁的lambda表达式

例 : 

public class LambdaTest {
    public static void main(String[] args) {
        //实现线程当中提及的Runnable接口,重写了当中的一个抽象方法, 并创建了匿名实现类的对象
        Runnable r1 = new Runnable() {
            @Override
            public void run() {
                System.out.println("hexua你太酷啦");
            }
        };
        r1.run();

        //如果我们使用lambda表达式,将会非常简洁
        Runnable r2 = () -> {
            System.out.println("hexua你太酷啦");
        };
        r2.run();
        //运行会发现,两种写法运行结果相同
        //hexua你太酷啦
        //hexua你太酷啦
    }
}

接着我们来介绍一下lambda表达式的语法.

3.lambda表达式的语法

lambda表达式 : 在java8中引入了一种新的语法元素和操作符.即"->".该操作符被称为箭头操作符.它将lambda表达式分为两个部分 : 

(1)左侧:指定了lambda表达式需要的参数列表.

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

接下来介绍六种语法格式.

4.语法格式

(1). 无参数, 无返回值类型

@Test
    public void test1() {
        //无参数, 无返回值类型
        Runnable r1 = () -> {
            System.out.println("语法格式-1");
        };
        r1.run();
        //输出和 : 语法格式-1
    }

(2). 需要一个参数, 但是没有返回值

@Test
    public void test2() {
        //需要一个参数, 但没有返回值
        LambdaInterface<String> l1 = (String s) -> {
            System.out.println(s + "tkl");
        };
        l1.show("hexua");
        //输出 : hexuatkl
    }
}
interface LambdaInterface<T> {
    void show(T s);
}

(3). 数据类型可以省略, 因为可以由编译器推断得出, 称为类型推断

@Test
    public void test3() {
        //类型推断, String类型可以省略
        LambdaInterface<String> l1 = (s) -> {
            System.out.println(s + "tkl");
        };
        l1.show("hexua");
        //输出 : hexuatkl
    }
}
interface LambdaInterface<T> {
    void show(T s);
}

(4). 参数列表只有一个参数的情况下, 小括号可以省略

@Test
    public void test4() {
        //参数列表只有一个参数的情况下, 圆括号也可以不写
        LambdaInterface<String> l1 = s -> {
            System.out.println(s + "tkl");
        };
        l1.show("hexua");
        //输出 : hexuatkl
    }
}
interface LambdaInterface<T> {
    void show(T s);
}

(5). 需要两个或两个以上的参数时,多条执行语句, 并且可以有返回值

@Test
    public void test5() {
        LambdaInterface<String> l1 = (s, t) -> {
            System.out.println("我也不知道这里写什么");
            return s + "你过来啊" + t;
        };
        System.out.println(l1.show("hexua", "hexi"));
        //输出 : 我也不知道这里写什么
        //hexua你过来啊hexi
    }
}
interface LambdaInterface<T> {
    String show(T s, String t);
}

(6). 若只有一条语句, return和大括号都可以省略

@Test
    public void test6() {
        //只有一条语句时, return与大括号若有, 都可以省略
        LambdaInterface l2 = () -> "return与大括号都可以省略";//返回值语句
        System.out.println(l2.show());
        //输出 : return与大括号都可以省略
    }
}
interface LambdaInterface<T> {
    String show();
}

5.(重点)四种常见的函数式接口

(1). 消费型接口 : 对类型为T的对象应用操作, 包含方法void accept(T t).

Consumer<T>
抽象方法 : void accept(T t)

(2). 供给型接口 : 返回类型为T的对象, 包含方法T get().

Supplier<T>
抽象方法 : T get()

(3). 函数型接口 : 对类型为T的对象应用操作, 并返回类型为R的对象. 包含方法R apply(T t)

Function<T, R>
抽象方法 : R apply(T t)

(4). 判断型接口 : 确定类型为T的对象是否满意某约束, 并返回boolean值, 包含方法boolean test(T t)

Predicate<T>
抽象方法 : boolean test(T t)
  • 33
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值