Java8的Lambda表达式初步学习

Lambda表达式是java8新出的特性,lambda是一块代码,由于java中没有函数类型,我们不得不将实现特定功能的代码块写在匿名内部类中,早就有人调侃匿名内部类类型一行、方法名一行,真正方法内容一行,而有了lambad表达式,我们可以取代部分匿名内部类,减少多余代码,提高代码可读性。

常用场合:

1.实现Comparator接口,进行排序操作

2.实现Runnable接口,进行多线程操作

3.实现事件监听器ActionListener接口,进行事件监听

4.对集合数据进行操作,Java8为了支持Lambad对集合新增了很多方法,可以用更简洁的方法做同样的事情。

Ps:Lambda的用法很多,其余的静待你慢慢挖掘

例子1:实现Comparator接口排序。

Lambda之前,我们先看看原来我们是怎么实现的:

List<String>list=Arrays.asList("b","d","c","a","e");
                              System.out.println(list);
                              list.sort(newComparator<String>() {
                                             @Override
                                             public int compare(String x, String y) {
                                                            return x.compareTo(y);
                                             }
                              });
                              System.out.println(list);

这段代码首先输出 bdcae, 经过实现 Comparator 接口的排序后输出 abcde, 下面是 Lambda 实现:
List<String>list=Arrays.asList("b","d","c","a","e");
                              System.out.println(list);
                              list.sort((x,y)->x.compareTo(y));
                              System.out.println(list);

研究这两段代码,我们知道,其实排序的核心只有x.compareTo(y)这一句,Lambda表达式让人更一目了然。

例子2:实现Runnable接口的多线程。

依旧,先看看我们原来怎么做的:

new Thread(new Runnable() {
                                             public void run() {
                                                            System.out.println("abc");
                                             }
                              }).start();

这段代码很简单,新开一个线程输出 abc, 我们知道,核心就在输出 abc ,仿照例 1 ,你是不是有点明白 Lambad 怎么用了?下面是 Lambda 实现:
new Thread(()->System.out.println("abc")).start();

上面的Lambda表达式里没有参数传递,所以()里是空的,而例1里传入了xy,但是没有写出类型,这是因为如果Lambda表达式的参数类型可以被推导出来时可以省略不写,写上类型也是没有错的,不过要写上类型的话所有参数都必须写上。

3:事件监听器。

自建一个Jframe窗体和一个按钮,事件代码如下:

button.addActionListener(newActionListener() {
                  @Override
                  public voidactionPerformed(ActionEvent e) {
                        JOptionPane.showMessageDialog(null, "hello");
                  }
            });

弹出一个对话框写着 hello ,想必现在你已经会使用 Lambda 改写了吧,先自己试一下,然后对比下面的代码:
button.addActionListener((e)->JOptionPane.showMessageDialog(null,
"hello"));

现在是不是有个疑惑, Lambda 是不是只能写简短的语句呢?答案当然是否定的,用大括号包起代码块即可如下:
button.addActionListener((e)->{
                  Stringx="hello";
                  JOptionPane.showMessageDialog(null, x);
            });

我就不费事写一大串代码了,Lambda表达式的方法体与嵌套代码块有着相同的作用域,也适用同样的命名冲突和屏蔽规则。


4:集合操作

还记得例1输出的数组集合吗?如果我们不是要一次性打印出整个数组,而是遍历,我们一般是这样写的:

for (String string : list) {
                  System.out.println(string);
            }

Java8 新增了很多支持Lambda表达式的对集合的操作方法,其中有一个就是遍历,你可以这样写:
list.forEach(x->System.out.println(x));

不过我推荐下面这种更优雅的写法:
list.forEach(System.out::println);

为了下文涉及到的 ::( 两个冒号 ) 操作符,我们再看一个例子。 Objects 类定义了 isNull 方法,它返回一个 bool 值。 ArrayList 新增了一个 removeIf 方法,参数是 Predicate 类型。是专门用来传递 Lambda 表达式的。下面的代码是删除数组列表里的 null 值:
List<String> list=new ArrayList<String>(Arrays.asList("b","d","c",null,"e"));
list.forEach(System.out::print);
list.removeIf(x->Objects.isNull(x));
list.forEach(System.out::print);

第一次输出是有 null 值的,第二次则去掉了,下面我们用 :: 的形式,这种更优雅:
list.removeIf(Objects::isNull);

和上面是一样的效果。

正如你看到的那样,操作符 :: 将方法名称与类或对象名称分隔开。

有以下三种使用方式:

1. :: 实例方法

2. :: 静态方法

3.对象 :: 实例方法

第一种使用方式,第一个参数变成方法的接收者,并且其他参数也传递给该方法。例如例1的排序(x,y)->x.compareTo(y),可以写成String::compareTo

第二种方式,所有的参数传递给静态方法。例如上面的x->Objects.isNull(x)等同于Objects::isNull

第三种方式,在给定的对象上调用方法,并且参数传递给实例方法。例如x->System.out.println(x)等同于System.out::println

此外还有很多新增的方法没有举例。但Lambda的基本用法想必已经很清晰了,使用Lambda可以使我们写出更简洁优雅的代码,希望大家一起学习。

文章来自我的个人博客,地址: http://jimblog.site/blog/articles/75.html
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值