1.函数式编程
在java里面方法体不能独立存在,在java 8 以前可以使用匿名内部类来弥补这一缺陷,但使用匿名内部类也有缺点,那就是会使得代码显得比较臃肿。现在我们可以使用Lambda表达式来解决这一现状。下面来通过一个完整的例子来解释这种区别,该例子的主要功能为从一个list中选出符合要求的元素并组成一个新的list,并且删选条件是可扩展的。
2.样例
import java.util.ArrayList;
import java.util.List;
interface FilterProcessor<T>
{
boolean process(T t);
}
public class LambdaDemo
{
public static void main(String[] args)
{
//定义需要使用的对象
Person p1 = new Person();
Person p2 = new Person();
p1.setAge(10);
p1.setAge(31);
p2.setName("Nancy");
p2.setName("Andy");
//构建需要筛选的List
List<Person> pList = new ArrayList<>();
pList.add(p2);
pList.add(p1);
//实例化Filter 以便使用其filter方法
Filter<Person> f = new Filter<Person>();
//使用Lambda表达式传递
List<Person> result = f.filter(pList, p -> p.getAge() > 30);
//使用匿名内部类的方式
/*List<Person> result = f.filter(pList, new FilterProcessor<Person>()
{
public boolean process(Person person)
{
if(person.getAge() > 30)
return true;
return false;
}
});
*/
System.out.println(result.get(0).getName() + "---" + result.size());
}
}
class Filter<T>
{
List<T> filter(List<T> list, FilterProcessor<T> filterProcessor)
{
List<T> result = new ArrayList<T>();
for(T t : list)
{
if(filterProcessor.process(t))
result.add(t);
}
return result;
}
}
class Person
{
private String name;
private int age;
public String getName()
{
return name;
}
public void setName(String name)
{
this.name = name;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
}
这样我们便可以通过传入不同的筛选方法来达到不同的目的,实现程序的可扩展性。
Note:本篇博文里面的代码思路见这里