Lambda表达式用法

什么是Lambda表达式

Lambda表达式是Java8的一个新特性,可以使代码更加的简洁,提高代码可读性(如果没学过Lambda另说)。

以下是百度百科对Lambda的解释:

Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。

Lambda是一种更加简洁的匿名函数,也可以理解成可以当作参数进行传递的代码。需要注意的是在实现的接口中只能有一个方法,如果是在接口中存在了多个方法,这样就不能用Lambda表达式了。

用法

Lambda一般以箭头分割,左侧是参数,右侧是进行处理的代码。

大概就是这样:

        Runnable r = () -> System.out.println("这是一个栗子");

本来在等号的右边应该写一个匿名类,然后在匿名类中写各种代码,如果使用Lambda表达式直接一行就行了。

然后Lambda大概有以下几种类型:

  • 无参数无返回值
  • 无参数有返回值
  • 有参数无返回值
  • 有参数有返回值

目测就这了,应该没有别的了吧。

无参数无返回值

大约就是下面这种亚子,其中如果只有一行代码的话可以省略右侧的花括号。

    () -> {代码}

就像刚刚那个Runnable接口的栗子,老简单了,另外就是如果只有一行代码的话可以省略花括号。

有参数无返回值

这种根据参数的个数不同也有不同的情况,一种参数可以把小括号省略掉,参数多了之后就不能省略括号。但是可以省略参数的类型,这个时候需要参数和对应的方法的参数对应。

	x -> {代码}
	(int x, int y) -> {代码}
	(x, y) -> {代码}

这个是一个简单的小栗子,这个是对列表的迭代。

        List<String> list = Arrays.asList("abc", "dae", "daed");
        list.forEach((x) -> System.out.println(x));

有参数有返回值

如果是只有一条语句的话可以省略return如果是多条的话,在花括号最后需要用return返回结果。参数的格式同上。

        List<String> list = Arrays.asList("abc", "dae", "daed");

        list.sort( (x, y) -> Integer.compare(x.length(), y.length() ) );

函数式接口

因为使用Lambda表达式需要依托接口,函数式接口就是Java官方给我们提供的一些通用的接口,方便我们的使用。另外就是对于函数式接口,会有一个注解:@FunctionalInterface来标识这个东西是一个函数式接口,不使用也没啥。

另外需要说明一点,在所有的函数式接口里面只有一个方法,而@FunctionalInterface也要求接口中有且仅有一个方法。

具体的有很多,在java.util.function包里面,常用的有以下几个:

  • Consumer< T >
  • Function< T, R >
  • Supplier< T >
  • Predicate< T >

Consumer

以下是这个接口的部分代码,简单来说就是传入一个参数,然后进行使用,常用的就是迭代器,输出。

@FunctionalInterface
public interface Consumer<T> {

    /**
     * Performs this operation on the given argument.
     *
     * @param t the input argument
     */
    void accept(T t);
}

Function

这个是Function接口的代码,输入一个参数进行处理,然后进行输出。

@FunctionalInterface
public interface Function<T, R> {

    /**
     * Applies this function to the given argument.
     *
     * @param t the function argument
     * @return the function result
     */
    R apply(T t);
}

Supplier

输出数据

@FunctionalInterface
public interface Supplier<T> {

    /**
     * Gets a result.
     *
     * @return a result
     */
    T get();
}

Predicate

输入数据,根据判断的结果进行判断,常用在过滤中。

@FunctionalInterface
public interface Predicate<T> {

    /**
     * Evaluates this predicate on the given argument.
     *
     * @param t the input argument
     * @return {@code true} if the input argument matches the predicate,
     * otherwise {@code false}
     */
    boolean test(T t);
}

引用

方法引用

对象的引用 :: 实例方法名
类名 :: 静态方法名
类名 :: 实例方法名

构造器引用

类名 :: new

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值