2022-09-09 10:51

lambda表达式详解

wanmatea

其它

(918)

(0)

收藏

一、lambda表达式是什么

lambda表达式, 是Java8中的一个新特性。lambda表达式允许你通过表达式来代替功能接口。

二.lambda表达式语法

(args1,args2) -> body

(args1,args2) ->{ body}

1、可选类型声明:可以不指定参数类型,编译器可以根据上下文推断参数值。

2、可选的参数圆括号:一个参数无需定义圆括号,但多个参数需要包含在圆括号内并用逗号间隔。

3、可选的大括号:如果表达式主体只包含了一个语句,就不需要使用大括号,多条表达式语句需要包含在大括号内。

4、可选的返回关键字:如果主体只有一个表达式返回值则编译器会自动返回值,如果有多个表达式且有返回值,需要用return显式指定返回值。

例如:

//接收一个参数s并在控制台打印

(String s)->System.out.println(s)

//接收两个int型参数x和y,并返回它们的和

(int x, int y) -> x + y

//不需要参数,返回值为6

()->6

//接收两个参数x和y,并返回它们的乘积

  (x,y)->{return x*y;}

//在控制台打印Hello World

  ()->System.out.println("Hello world")

三.基于函数式接口使用 lambda 表达式

lambda 表达式的使用需要借助于函数型接口,也就是说只有函数型接口出现的地方,我们才可以将其用 lambda 表达式进行简化。那么什么是函数接口?函数型接口就是只有一个抽象方法的接口。

还是用我们上面的例子,用lambda表达式实现代码:

public static void main(String[] args)
    {
 Test t=new Test();
 t.show(()->System.out.println("Hello"));
}

函数接口最多只能有一个抽象方法,但是可以有多个默认方法和静态方法。

我们可以用default关键字在接口中定义具备方法体的默认方法。

示例:

@FunctionalInterface
public interface Inner {
public void show();
//默认方法
default String show2()
{
return "World";
}
//静态方法
       static String show3()
       {
           return "Java";
   }
}

在定义时我们为该接口添加了@FunctionalInterface注解,用于标记该接口是一个函数式接口,不过该注解是可选的,当添加了该注解之后,编译器会限制了该接口只允许有一个抽象方法,否则报错,所以推荐为函数式接口添加该注解。

四.lambda表达式示例

1、启动一个新线程

new Thread(()->System.out.println("启动新线程")).start();

2、遍历List

List<String> items = new ArrayList<>();
items.add("H");
items.add("e");
items.add("l");
items.add("l");
items.add("o");  
items.forEach(item->System.out.print(item));

在 Java8 中,为 Iterable 接口添加了默认的 forEach 方法,而 Collection 接口继承了 Iterable 接口,所以所有的继承自 Collection 的集合类都可以直接调用 forEach 方法。

3、对List进行排序并输出

List<Integer> items = new ArrayList<>();
items.add(3);
items.add(7);
items.add(5);
items.add(2);
items.add(9);
items.sort((o1,o2)->o1-o2);
System.out.println(items);

输出结果:

[2, 3, 5, 7, 9]

上面的例子我们调用sort()方法对List进行排序,sort方法接受一个Comparator接口的实现类,这个接口中有且仅有一个方法compare。

Comparator接口源码:

public interface Comparator {
           int compare(T o1, T o2);
           boolean equals(Object obj);
}

我们可以看到Comparator接口有两个抽象方法,equals是继承自Object的方法,所以可以用lambda表达式。

在Java中,Object类是所有类的父类。

0条评论

点击登录参与评论