重点知识学习--[Java 8 之 Lambda 表达式]

Posted 小智RE0

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重点知识学习--[Java 8 之 Lambda 表达式]相关的知识,希望对你有一定的参考价值。

首先回顾一下Arrays数组工具类;
有个sort()排序方法;默认升序排序;

/**
 * @author by 信计1801 李智青 学号:1809064012
 */
public class Demo 
    public static void main(String[] args) 
        String[] arr = new String[]"p","x","z","v","j","a","s";
        Arrays.sort(arr);
        System.out.println(Arrays.toString(arr));
    

默认是升序排序的

[a, j, p, s, v, x, z]

那么现在我想要让它降序排序呢?
有个重载方法是可以传入比较器的;


回顾一下,这里有个比较方法compare( );

还记得之前学习时尝试过,在实现比较接口的外部类定义一个比较规则;
调用规则即可;
那么试试在这个案例试一下;

/**
 * @author by 信计1801 李智青 学号:1809064012
 */
public class OutCompare implements Comparator<String> 
    @Override
    public int compare(String o1, String o2) 
        return o2.compareTo(o1);
    

即可达到降序的效果

当然,再想想,也是学过内部类的,那么在这里定义内部类,参数中使用即可;

public class Demo 
    public static void main(String[] args) 
        String[] arr = new String[]"p","x","z","v","j","a","s";
        Arrays.sort(arr,new InCompare());
        System.out.println(Arrays.toString(arr));
    
    
    //在内部类中定义规则;
    static class InCompare implements Comparator<String> 
        @Override
        public int compare(String o1, String o2) 
            return o2.compareTo(o1);
        
    

同样,也是达到了降序的效果

[z, x, v, s, p, j, a]

再回顾回顾;使用匿名内部类好像更加方便

/**
 * @author by 信计1801 李智青 学号:1809064012
 */
public class Demo1 
    public static void main(String[] args) 
        String[] arr = new String[]"p","x","z","v","j","a","s";
        Arrays.sort(arr, new Comparator<String>() 
            @Override
            public int compare(String o1, String o2) 
                return o2.compareTo(o1);
            
        );
        System.out.println(Arrays.toString(arr));
    

都知道Java 是一门面向对象语言,除了部分简单数据类型,Java 中的一切都是对象,即使数组也是一种对象,每个类创建的实例也是对象。

在 Java 中定义的函数(方法)不能完全独立,不能将方法作为参数或返回一个方法给实例

后来;Java 8 增加了新特性Lambda 表达式

Lambda 表达式:

  • Lambda 表达式是一个匿名函数, lambda 表达式可理解为一段可以传递的代码(将代码段像数据一样传递)。简洁,灵活。
  • Lambda 表达式的本质只是一个"语法糖",由编译器推断并帮你转换包装为常规的代码,因此你可以使用更少的代码来实现同样的功能。

语法糖:–引用百科

语法糖(Syntactic sugar),也译为糖衣语法,是由英国计算机科学家彼得·约翰·兰达(Peter J. Landin)发明的一个术语,指计算机语言中添加的某种语法,这种语法对语言的功能并没有影响,但是更方便程序员使用。通常来说使用语法糖能够增加程序的可读性,从而减少程序代码出错的机会。

Lambda结构

  • 语法: (参数) ->函数体;将接口中的函数作为参数进行传递;
  • 作为匿名函数,一般是在方法的参数作为接口时;代替之前的匿名内部类,参数类型可以不写,会自动推断类型,那么如何推断呢;它就是要求实现的接口内有且只有一个抽象方法;
  • Lambda 表达式可以具有零个,一个或多个参数。
  • 可以显式声明参数的类型,也可以由编译器自动从上下文推断参数的类型。
    例如 (int a,int b)与 (a,b)相同。
  • 参数用小括号括起来,用逗号分隔。例如 (a, b) 或 (int a, int b) 或 (String a, int b, float c)。
  • 空括号用于表示一组空的参数。例如 () -> 42。
  • 当有且仅有一个参数时,如果不显式指明类型,则不必使用小括号。
    例如 a -> return a*a。
  • Lambda 表达式的正文可以包含零条,一条或多条语句。
  • 如果 Lambda 表达式的正文只有一条语句,则大括号可不用写,且表达式
    的返回值类型要与匿名函数的返回类型相同。
  • 如果 Lambda 表达式的正文有一条以上的语句必须包含在大括号(代码块)
    中,且表达式的返回值类型要与匿名函数的返回类型相同。

刚才的排序案例要是用Lambda表达式写的话,就比较简单了;

public class Demo1 
    public static void main(String[] args) 
        String[] arr = new String[]"p","x","z","v","j","a","s";
        
        Arrays.sort(arr,(a,b)->  return b.compareTo(a); );
        System.out.println(Arrays.toString(arr));
    

案例:

说到这个实现接口有且只有一个抽象方法时,可以看看这个知识;函数式接口/ 功能性接口;

功能性接口(单抽象方法接口)

  • 功能接口是 java 8 中的新增功能,它们只允许一个抽象方法。
  • 可使用 Lambda 表达式,方法引用和构造函数引用来表示。
  • Java 8 有个专门的注解–>@FunctionalInterface,当你注释的接口违反了 Functional Interface 的约定时(定义的抽象方法超出一个),会出现编译器级别错误。

回顾一下之前学习GUI时,按钮 有个监听事件addActionListener()


这个ActionListener 是个接口;它里面就是有一个抽象方法,虽然没有@FunctionalInterface注解;但是也符合Lambda表达式的规则;

那么试试用Lambda表达式写一下

//匿名内部类写法;
JButton jButton = new JButton("按钮");
jButton.addActionListener(new ActionListener() 
    @Override
    public void actionPerformed(ActionEvent e) 
        //这里写具体操作;
    
);

//Lambda表达式写法;
jButton.addActionListener(a->
    //这里写具体操作;
);

再回顾一下,当时学习线程部分的知识;线程类Thread;这里面的Runnable接口可是实打实的功能性接口啊

用Lambda表达式书写一下

//之前的写法;
new Thread(new Runnable() 
    @Override
    public void run() 
        //具体的操作;
    
);

//使用Lambda表达式;
new Thread(()->
    //具体的操作
);

还有之前以经常使用的遍历集合常用

List<String> l = new ArrayList<>();
   l.add("qwe");
     l.add("这");
     l.add("从零开始");
     l.add("的");
     l.add("异世界生活");
     for (String s : l) 
         System.out.print(s +" ");
     

若使用Lambda表达式遍历,也是十分简洁

//使用Lambda表达式
l.forEach(a-> System.out.print(a+" "));

以上是关于重点知识学习--[Java 8 之 Lambda 表达式]的主要内容,如果未能解决你的问题,请参考以下文章

Java 8 Lambda表达式之方法引用 ::双冒号操作符

Java 8 Lambda表达式之方法引用 ::双冒号操作符

高效 告别996,开启java高效编程之门 2-8实战:判断逻辑参数化-Lambda表达式

Java学习笔记之 Lambda表达式

Java8新特性之lambda

Android学习探索之Java 8 在Android 开发中的应用