上一章我介绍了lambda表达式的基本语法,今天我来介绍一下java中的函数式接口。
一、定义:
所谓函数式接口其实就是只定义了一个抽象方法的接口就是函数式接口。例如java.lang.Runable接口就是一个函数式接口。我们可以在接口上添加@FunctionalInterface注解来表示这接口是一个函数式接口但是这个注解并不是必须的,类似于@Override注解。在java8中提供了一些常用的函数式接口,下面我来介绍一些常用的函数式接口。
二、常用的函数式接口
1.Predicate<T>
表示一个参数的谓词,用来测试输入是否满足条件。代码实例:
定义一个ListFilterUtil的工具类:
public class ListFilterUtils { public static <T> List<T> FilterList(List<T> list,Predicate<T> predicate){ List<T> returnList = new ArrayList<T>(); if(list!=null&&list.size()>0){ for (T t : list) { if(predicate.test(t)){ returnList.add(t); } } } return returnList; } }
定义一个对象Car:
public class Car { public Car(String price, String colour) { super(); this.price = price; this.colour = colour; } private String price; private String colour; public String getPrice() { return price; } public void setPrice(String price) { this.price = price; } public String getColour() { return colour; } public void setColour(String colour) { this.colour = colour; } @Override public String toString() { return "Car [price=" + price + ", colour=" + colour + "]"; } }
调用工具方法:
public static void main(String[] args) { List<Car> list = new ArrayList<Car>(); 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<Car> 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>
表示进行函数类型的转换,T是函数的输入类型,R是函数的输出类型。代码实例:
定义一个转换list集合的方法:
public static <T,R> List<R> convser(List<T> list,Function<T,R> mapper){ List<R> returnList = new ArrayList<R>(); if(list!=null&&list.size()>0){ for (T t : list) { returnList.add(mapper.apply(t)); } } return returnList; }
调用工具方法:
//把颜色都设置为大写 list = ListUtils.convser(list,(car)->new Car(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<T>
表示接受输入参数并且不返回结果的操作与Function不同的是Consumer是在原来对象的基础上修改而Function接口是新建对象。代码实例:
修改转换的接口:
public static <T> List<T> convser(List<T> list,Consumer<T> mapper){ if(list!=null&&list.size()>0){ for (T t : list) { mapper.accept(t); } } return list; }
调用转换的方法:
//把颜色都设置为大写 ListUtils.convser(list,(car)->{car.setColour(car.getColour().toUpperCase());}); for (Car car1 : list) { System.out.println(car1); }
输出的结果和Function接口是一样的。
上面我们介绍了三个常用的函数式接口,在平时的开发中对于集合的操作我们更常使用的是java8提供的Stream Api,关于java8提供的Stream API我会在以后的博客中介绍。