Java8 新特性:(一)Lambda表达式


一、Lambda 表达式是什么?

Lambda 表达式是 Java SE 8 中一个重要的新特性。Lambda 表达式允许你通过表达式来代替功能接口。 lambda表达式就和方法一样,它提供了一个正常的参数列表和一个使用这些参数的主体。Lambda表达式还增强了集合库,添加了2个对集合数据进行批量操作的包: java.util.function 包以及java.util.stream 包。

Lambda 是一个匿名函数,我们可以把 Lambda表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。

Java8发布以后,lambda表达式将大量替代匿名内部类的使用,简化代码的同时,更突出了原来匿名内部类中最重要的那部分包含真正逻辑的代码。


二、Lambda 用法

2.1 Lambda 语法

Lambda表达式在Java 语言中引入了一个新的语法元素和操作符。这个操作符为 “->” , 该操作符被称为 Lambda 操作符或剪头操作符。它将 Lambda 分为两个部分:

  • 左侧:指定了 Lambda 表达式需要的所有参数
  • 右侧:指定了 Lambda 体,即 Lambda 表达式要执行的功能

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

Runnable r1 = () -> System.out.println("Hello Lambda!");

(2)Lambda 需要一个参数

Consumer<String> con = (x) -> System.out.println(x);

(3)Lambda 只需要一个参数时,参数的小括号可以省略

Consumer<String> con = x -> System.out.println(x);

(4)Lambda 需要两个参数,并且有返回值

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

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

  return Integer.compare(x, y);

 };

(5)当 Lambda 体只有一条语句时,return 与大括号可以省略

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

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

Comparator<Integer> com = (Integer x, Integer y) -> {  //Integer 类型可以省略

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

   return Integer.compare(x, y);

  };

//示例1:不需要接受参数,直接返回10

()->10

//示例2:接受两个int类型的参数,并返回这两个参数相加的和
(int x,int y)->x+y;

//示例2:接受x,y两个参数,该参数的类型由JVM根据上下文推断出来,并返回两个参数的和
(x,y)->x+y;

//示例3:接受一个字符串,并将该字符串打印到控制到,不反回结果
(String name)->System.out.println(name);

//示例4:接受一个推断类型的参数name,并将该字符串打印到控制台
name->System.out.println(name);

//示例5:接受两个String类型参数,并分别输出,不反回
(String name,String sex)->{System.out.println(name);System.out.println(sex)}

//示例6:接受一个参数x,并返回该该参数的两倍
x->2*x


2.2 替代匿名内部类

lambda表达式用得最多的场合就是替代匿名内部类,而实现Runnable接口是匿名内部类的经典例子。lambda表达式的功能相当强大,用()->就可以代替整个匿名内部类。

// 如果使用匿名内部类:
    @Test
    public void oldRunable() {
        new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("The old runable now is using!");
            }
        }).start();
    }

// 使用lambda表达式:
    @Test
    public void runable() {
        new Thread(() -> System.out.println("It's a lambda function!")).start();
    }



2.3 对集合进行迭代

forEach()可以迭代集合中所有的对象,并且将lambda表达式带入其中。

// 普通的迭代
    @Test
    public void iterTest() {
        List<String> languages = Arrays.asList("java","scala","python");
        //before java8
        for(String each:languages) {
            System.out.println(each);
        }
        //after java8
        languages.forEach(x -> System.out.println(x));
        languages.forEach(System.out::println);
    }

// 使用Lambda进行迭代
languages.forEach(System.out::println);


2.4 Lambda 表达式结合Stream对集合操作

具体用法下篇文章详细介绍!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值