Java之Lambda表达式

1、什么是Lambda表达式

Lambda表达式,也可称为闭包也称匿名函数。
闭包函数:声明在一个函数中的函数,叫做闭包函数。
可以理解成一个方法中的方法,没有方法名,但是有参数与方法体。

Lambda表达式是java1.8的一个新特性,早于1.8版本无法使用。
它是推动Java8发布的最重要的新特性。

2、为什么使用Lambda表达式

我们可以把Lambda表达式理解为一段可以传递的代码
(将代码像数据一样进行传递)。Lambda允许把函数作
为一个方法的参数,使用Lambda表达式可以写出更简洁、
更灵活的代码,而其作为一种更紧凑的代码风格,
使Java的语言表达能力得到了提升。

简单来讲就是能够使你的代码更加的简洁(装逼),但是身为程序员我们可能平时使用Lambda表达式的机会不多,但是一定要做到能看懂。

3、Lambda表达式语法

Lambda表达式在Java语言中引入了一个操作符**“->”**,该操作符被称为Lambda操作符或箭头操作符。它将Lambda分为两个部分:

左侧:指定了Lambda表达式需要的所有参数
右侧:制定了Lambda体,即Lambda表达式要执行的功能。
左侧 -> 方法体

例如:

(x)-> System.out.println(x);

这里我能的x就是传入的参数,箭头指向的就是我们的方法体。

1、语法格式

(1) 语法格式一:无参,无返回值,Lambda体只需一条语句

public void test01(){
    Runnable runnable=()-> System.out.println("Runnable 运行");
    runnable.run();//结果:Runnable 运行
  }

(2) 语法格式二:Lambda需要一个参数,无返回值。如下:

public void test02(){
Consumer<String> consumer=(x)-> System.out.println(x);

    consumer.accept("Hello Consumer");//结果:Hello Consumer

}

(3) 语法格式三:Lambda只需要一个参数时,参数的小括号可以省略,如下:

public void test02(){
Consumer<String> consumer=x-> System.out.println(x);

consumer.accept("Hello Consumer");//结果:Hello Consumer

}

(4) 语法格式四:Lambda需要两个参数,并且Lambda体中有多条语句。

public void test04(){
    Comparator<Integer> com=(x, y)->{
      System.out.println("函数式接口");
      return Integer.compare(x,y);
}

(5)语法格式五:有两个以上参数,有返回值,若Lambda体中只有一条语句,return和大括号都可以省略不写

public void test05(){
    Comparator<Integer> com=(Integer x, Integer y)-> Integer.compare(x,y);
System.out.println(com.compare(4,2));
}

6 Lambda表达式的参数列表的数据类型可以省略不写,因为JVM可以通过上下文推断出数据类型,即“类型推断”

public void test06(){

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

System.out.println(com.compare(4,2));//结果:1

  }

说了这么多可以一句话概括Lambda表达式的书写方法

    public interface A{

        String a(String b,String c);

    }
    public class B implements A{
        @Override
        public String a(String b, String c) {
            return b+c;
        }
    }

其中我们不需要知道Class B 的名字,同样也不需要a方法的名字
所以都可以省略,返回值的类型我们可以通过上下文可以推断出来,String的返回值类型也可以省略,参数的类型也可以通过判断得到。

因此就得到了以下的情况:

public interface A{
String a(String b,String c);
}
public class B implements A{
@Override
public String a (String b, String c) {
return b+c;
}
}

所以就得到Lambda表达式为:

(b,c)->b+c;

最后由我们的接口类型一接。

A a = (b,c)->b+c;

就得到了我们最终的表达式。

4、函数式接口

4.1 什么是函数式接口

只包含一个抽象方法的接口,就称为函数式接口。我们可以通过Lambda表达式来创建该接口的实现对象。
我们可以在任意函数式接口上使用@FunctionalInterface注解,这样做可以用于检测它是否是一个函数式接口,同时javadoc也会包含一条声明,说明这个接口是一个函数式接口。

我们在使用lambda表达式的时候,通常需要定义一个接口,如果我们每次都去定义一个接口,显然是有点儿麻烦的,
所以java8中提供了四个内置的函数式接口,通过直接使用这四个接口,或者使用它们的扩展接口,就可以让我们很方便的使用lambda表达式。

Consumer:
表示接受单个输入参数且不返回结果的操作。与大多数其他功能接口不同,消费者预计将通过副作用操作。
返回按顺序执行此操作的组成消费者,然后是后续操作。如果执行任一操作抛出例外情况,则将其中继到组成操作的呼叫者。如果执行此操作抛出一个例外,则不会执行后操作

public static void makeMoney(Integer money, Consumer<Integer> consumer){
        consumer.accept(money);
    }

    public static void test01(){
        makeMoney(100,t-> System.out.println("今天赚了"+t));//结果:今天赚了100
    }

Supplier: 代表结果的供应商。
每次调用供应商时,均不要求退回新的或不同的结果。

 public static void test02(){
        List list = addNumInList(10, () -> (int) (Math.random() * 100));
        list.forEach(t-> System.out.println(t));
    }
    public static List addNumInList(int size, Supplier<Integer> supplier){
        List<Integer> list=new ArrayList();
        for (int i = 0; i < size; i++) {
            list.add(supplier.get());
        }
        return list;
    }

Function: 表示接受一个参数并产生结果的函数。
这是一个功能界面,其功能方法是应用(对象)。

public static String handleStr(String s, Function<String, String> f){
        return f.apply(s);
    }
    public static void test03(){
        System.out.println(handleStr("abc",(String s)->s.toUpperCase()));
    }

Predicate: 表示一个论点的谓词(布尔值函数)。
这是一个功能界面,其功能方法是测试(对象)。

 public static void test04(){
        List<String> strings = Arrays.asList("啊啊啊", "2333", "666", "?????????");
        List<String> stringList = filterStr(strings, (s) -> s.length() > 3);
        for (String s : stringList) {
            System.out.println(s);
        }
    }

Lambda表达式的基本使用的方法就是这样,在就接口中还包含了很多我们能使用的方法,我就不一一列举了,有兴趣的可以翻一翻api。

感谢阅读

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值