JAVA8无疑是JAVA的一次重大升级,JAVA8中引入了很多函数编程的思想。其中包括:lamada、stream流式编程、函数接口,方法引用等。本文主要讲解lamada,以及匿名函数的演化过程,最后是方法引用。
首先,来看一个栗子:
File[] files = new File("C:/360极速浏览器下载/帮助及反_files").listFiles((file) -> file.getName().endsWith(".jpg"));
for (File temp : files) {
System.out.println(temp.getName());
}
获取一个文件目录中的jpg文件,并输出文件名称到控制台。
虽然,是一个简单的栗子,但是包括了java里面的2个知识点:
public class Apple {
private String color;
private int weight;
public Apple(String color, int weight) {
super();
this.color = color;
this.weight = weight;
}
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public int getWeight() {
return weight;
}
public void setWeight(int weight) {
this.weight = weight;
}
}
List apples = Arrays.asList(new Apple("red", 1),new Apple("blue", 3)
,new Apple("red", 4),new Apple("blue", 5));
for (Apple apple : apples) {
if(apple.getColor().equals("red")){
//获取到结果
}
}
现在,农民找到已经成熟的水果,并且比较大的水果(weight > 3),首先出售,避免损失。
List apples = Arrays.asList(new Apple("red", 1),new Apple("blue", 3)
,new Apple("red", 4),new Apple("blue", 5));
for (Apple apple : apples) {
if(apple.getColor().equals("red") && apple.getWeight() > 3){
//获取到结果
}
}
此时,水果种植者,需要找到青色的苹果呢?….
我们又改怎样去实现?
比较上面2个实现,其实可以发现,除了 if 语句条件不同,其他的代码都是一致的。其实这也是 JAVA行为参数化的解决的一个问题,消除样式代码。
public static void main(String[] args) {
List apples = Arrays.asList(new Apple("red", 1),new Apple("blue", 3)
,new Apple("red", 4),new Apple("blue", 5));
getApple(apples, new Filter(){
@Override
public boolean filter(Apple apple) {
return apple.getColor().equals("red");
}
});
//这里如果,过滤条件发生改变,只需要传入不同的匿名对象即可。
}
public interface Filter{
boolean filter(T t);
}
public static void getApple(List apples,Filter filter){
for (Apple apple : apples) {
if(filter != null && filter.filter(apple)){
//获取到结果
}
}
}
以上通过 传递 Filter 对象 ,来传入不同的过滤条件。但是通过匿名对象传入过滤条件,代码结构过于松散,代码可读性不高,并且语法繁琐。
为了解决这个问题JAVA8中引入了,lamada实现将函数作为参数传递,lamada是一个函数:
apple -> apple.getColor().equals("red")
lamada : apple 函数参数,多个参数需要使用 ()包裹
-> 箭头
apple.getColor().equals(“red”) 方法体,一条语句,可以省略return ,多条语句,需要使用 { } 包裹。
介绍了lamada 的组成,以及书写。那么我们在哪些地方可以使用lamada呢?
可以看到,上面的例子中,lamada 作为 Filter 接口实现。而Filter 接口恰好只有一个抽象方法,知道 函数接口的同学,肯定已经猜到了,lamada 可以用在所有函数接口。
什么是函数接口呢? 函数接口: 只有一个抽象方法的接口。注意: 这里的抽象方法,不包含 JAVA8中的默认方法和静态接口方法。
最后: 方法引用,方法引用又是什么呢?简单来说:方法引用是lamada 的一种简化写法,方法引用让我们可以重复使用现有的方法,冰像lamada一样传递他们。
如:根据苹果的重量进行排序
List<Apple> apples = Arrays.asList(new Apple("red", 1),new Apple("blue", 3)
,new Apple("red", 4),new Apple("blue", 5));
apples.sort(Comparator.comparing(Apple::getWeight));
Comparator.comparing(Apple::getWeight) 将Apple 对象的getWeight 方法作为一个参数传递,同时返回另一个函数 Comparator 比较器。此处使用 静态导入comparing方法,代码会更加简洁
apples.sort(comparing(Apple::getWeight));
JAVA8中,引入很多函数API,其中 java.util.function 函数包中,已经定义了,很多函数接口,如例子中的:filter 用来过滤,function 接收一个对象,返回一个处理的对象,或另一个对象,常用于 映射 map,以及consume 消费,接受一个参数 不返回。等等