重点知识学习--[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表达式之方法引用 ::双冒号操作符