函数式编程
- 函数式编程(Functional programming)是一种思想特点。
面向对象:先找对象,让对象做事情。
函数式编程思想,忽略面向对象的复杂语法,强调做什么,而不是谁去做
我们要学习的Lambda表达式就是函数式思想的体现
lambda表达式
- lambda表达式是JDK8开始后的一种新语法形式
() -> {
}
()
:对应着方法的形参->
:固定格式{}
:对应着方法的方法体
Arrays.sort(arr, new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2 - o1;
}
});
- 简化匿名内部类的书写
Arrays.sort(arr, (Integer o1, Integer o2) -> {
return o2 - o1;
}
);
注意点
- Lambda表达式可以用来简化匿名内部类的书写
- Lambda表达式只能简化函数式接口的匿名内部类
- 函数式接口:
-
- 有且只有一个抽象方法的接口叫做函数式接口,接口上方可以加
@FunctionalInterface
注解
- 有且只有一个抽象方法的接口叫做函数式接口,接口上方可以加
public class LambdaDemo2 {
public static void main(String[] args) {
//1。利用匿名内部类的形式调用下面方法
//调用一个方法的时候,如果方法的形参是一个接口,那么我们要传递这个接口的实现类对象
//如果实现类对象只要用到一次,就可以用匿名内部类的形式进行书写
method(new Swim() {
@Override
public void swimming() {
System.out.println("正在游泳");
}
});
//2。利用lambda表达式进行改写
//必须是接口
//且是函数式接口:有且只有一个抽象方法的接口叫做函数式接口,接口上方可以加`@FunctionalInterface`注解
method(
() -> {
System.out.println("正在蛙泳");
}
);
}
public static void method(Swim s) {
s.swimming();
}
}
@FunctionalInterface
interface Swim {
public abstract void swimming();
}
总结
- lambda表达式的基本作用?
-
- 简化函数式接口的匿名内部类的写法
- lambda表达式有什么使用前提?
-
- 必须是接口的匿名内部类,接口中只能有一个抽象方法
- lambda表达式的好处?
-
- lambda是一个匿名函数,我们可以把lambda表达式理解为是一段可以传递的代码,它可以写出更简洁、更灵活的代码,作为一种更紧凑的代码风格,使Java语言表达能力得到了提升。
lambda表达式的省略缩写
- 省略核心:可推导,可省略
- 省略规则:
-
- 参数类型可以省略不写
-
- 如果只有一个参数,参数类型可以省略,同时()也可以省略
-
- 如果lambda表达式的方法体只有一行,大括号,分号,return可以省略不写,需要同时省略
Arrays.sort(arr, (Integer o1, Integer o2) -> {
return o2 - o1;
}
);
省略后
Arrays.sort(arr, (o1, o2) -> o2 - o1);
练习:lambda表达式简化Comparator接口的匿名内部类
定义数组并存储一些字符串,利用Arrays中的sort方法进行排序
要求:按照字符串的长度进行排序,短的在前面,长的在后面。(暂时不比较字符串里面的内容)
public class LambdaTest {
public static void main(String[] args) {
String[] arr = {"a", "aaaa", "aaa", "aa"};
//如果以后我们要把数组中的数据按照指定的方式进行排序,就需要用到sort方法,而且要指定排序的规则
//1.匿名内部类
Arrays.sort(arr, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
//按照字符串的长度进行排序
return o1.length() - o2.length();
}
});
//lambda 完整格式
Arrays.sort(arr, (String o1, String o2) -> {
return o1.length() - o2.length();
}
);
//lambda 简写格式
Arrays.sort(arr, (o1, o2) -> o1.length() - o2.length());
//[a, aa, aaa, aaaa]
System.out.println(Arrays.toString(arr));
}
}