上一章我介绍了lambda表达式的基本语法,今天我来介绍一下java中的函数式接口。
一、定义:
所谓函数式接口其实就是只定义了一个抽象方法的接口就是函数式接口。例如java.lang.Runable接口就是一个函数式接口。我们可以在接口上添加@FunctionalInterface注解来表示这接口是一个函数式接口但是这个注解并不是必须的,类似于@Override注解。在java8中提供了一些常用的函数式接口,下面我来介绍一些常用的函数式接口。
二、常用的函数式接口
1.Predicate
表示一个参数的谓词,用来测试输入是否满足条件。代码实例:
定义一个ListFilterUtil的工具类:
public classListFilterUtils {public static List FilterList(List list,Predicatepredicate){
List returnList = new ArrayList();if(list!=null&&list.size()>0){for(T t : list) {if(predicate.test(t)){
returnList.add(t);
}
}
}returnreturnList;
}
}
定义一个对象Car:
public classCar {publicCar(String price, String colour) {super();this.price =price;this.colour =colour;
}privateString price;privateString colour;publicString getPrice() {returnprice;
}public voidsetPrice(String price) {this.price =price;
}publicString getColour() {returncolour;
}public voidsetColour(String colour) {this.colour =colour;
}
@OverridepublicString toString() {return "Car [price=" + price + ", colour=" + colour + "]";
}
}
调用工具方法:
public static voidmain(String[] args) {
List list = new ArrayList();
list.add(new Car("5000","black"));
list.add(new Car("2000","green"));
list.add(new Car("2000","blue"));
list.add(new Car("2000","red"));
list.add(new Car("5000","red"));
list.add(new Car("5000","green"));
list.add(new Car("7000","black"));//获取价格为5000的汽车
List list1 = ListFilterUtils.FilterList(list,(car)->car.getPrice().equals("5000"));for(Car car1 : list1) {
System.out.println(car1.toString());
}
}
控制台输出:
Car [price=5000, colour=black]
Car [price=5000, colour=red]
Car [price=5000, colour=green]
这里只是展示如何使用Predicate接口,在实际的开发中我们并不会这样使用,而是使用java8中提供的Stream API。
2.Function
表示进行函数类型的转换,T是函数的输入类型,R是函数的输出类型。代码实例:
定义一个转换list集合的方法:
public static List convser(List list,Functionmapper){
List returnList = new ArrayList();if(list!=null&&list.size()>0){for(T t : list) {
returnList.add(mapper.apply(t));
}
}returnreturnList;
}
调用工具方法:
//把颜色都设置为大写
list = ListUtils.convser(list,(car)->newCar(car.getPrice(),car.getColour().toUpperCase()));for(Car car1 : list) {
System.out.println(car1);
}
控制台输出:
Car [price=5000, colour=BLACK]
Car [price=2000, colour=GREEN]
Car [price=2000, colour=BLUE]
Car [price=2000, colour=RED]
Car [price=5000, colour=RED]
Car [price=5000, colour=GREEN]
Car [price=7000, colour=BLACK]
3.Consumer
表示接受输入参数并且不返回结果的操作与Function不同的是Consumer是在原来对象的基础上修改而Function接口是新建对象。代码实例:
修改转换的接口:
public static List convser(List list,Consumermapper){if(list!=null&&list.size()>0){for(T t : list) {
mapper.accept(t);
}
}returnlist;
}
调用转换的方法:
//把颜色都设置为大写
ListUtils.convser(list,(car)->{car.setColour(car.getColour().toUpperCase());});for(Car car1 : list) {
System.out.println(car1);
}
输出的结果和Function接口是一样的。
上面我们介绍了三个常用的函数式接口,在平时的开发中对于集合的操作我们更常使用的是java8提供的Stream Api,关于java8提供的Stream API我会在以后的博客中介绍。