从简至繁阐述在开发中可能会用到的Java1.8中的技术,今天的这个例子是:当我们查询数据库的时候需要将列表List里面的数据进行筛选的时候,原始的操作方法,和新生方法的不同。
- 1.原始的代码
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 将列表中符合条件的值抽取出来。
*/
public class FunctionTest4 {
public static void main(String[] args) {
FunctionTest4 function = new FunctionTest4();
List<Person> lists = Arrays.asList(new Person("zhangsan",20)
,new Person("lisi",15),new Person("wangwu",30));
List<Person> listSource = function.getListByUserName("zhangsan",lists);
for(int i = 0; i < listSource.size(); i++) {
System.out.println(listSource.get(i).getUsername() + ", " + listSource.get(i).getAge());
}
}
/**
*
* @param userName 待匹配参数
* @param lists 源数据
* @return 与之匹配数据
*
* 最原始的方法
*/
public List<Person> getListByUserName(String userName,List<Person> lists) {
List<Person> listOfRare = new ArrayList<>();
for(int i = 0; i < lists.size(); i++) {
if(lists.get(i).getUsername().equals(userName)) {
listOfRare.add(lists.get(i));
}
}
return listOfRare;
}
}
- 2.稍稍带有1.8的特性的代码,我们采用BiFunction
import java.util.Arrays;
import java.util.List;
import java.util.function.BiFunction;
import java.util.stream.Collectors;
public class FunctionTest5 {
public static void main(String[] args) {
FunctionTest5 function = new FunctionTest5();
List<Person> lists = Arrays.asList(new Person("zhangsan",20)
,new Person("lisi",15),new Person("wangwu",30));
List<Person> listSource = function.getListByUsername("lisi",lists);
/** 下面的遍历我们也用java8里面的ForEach吧,不然,写着太麻烦了*/
listSource.forEach(person -> System.out.println(person.getUsername()+", " + person.getAge()));
}
/**
*
* @param userName 待匹配参数
* @param lists 源数据
* @return 与之匹配数据
* 这个方法里面用到了Java1.8中的BiFunction函数,但是,并没有简化多少
*/
public List<Person> getListByUsername(String userName, List<Person> lists) {
BiFunction<String,List<Person>,List<Person>> biFunction = new BiFunction<String, List<Person>, List<Person>>() {
@Override
public List<Person> apply(String s, List<Person> personList) {
return personList.stream().filter(person -> person.getUsername().equals(s)).collect(Collectors.toList());
}
};
return biFunction.apply(userName,lists);
}
}
- 3.以java8新特性的方法进行操作
import java.util.Arrays;
import java.util.List;
import java.util.function.BiFunction;
import java.util.stream.Collectors;
public class FunctionTest6 {
public static void main(String[] args) {
FunctionTest6 function = new FunctionTest6();
List<Person> lists = Arrays.asList(new Person("zhangsan",20)
,new Person("lisi",15),new Person("wangwu",30));
List<Person> listSource = function.getListByUsername("wangwu",lists,(userName,personOfList)->{
return personOfList.stream().filter(person -> person.getUsername().equals(userName)).collect(Collectors.toList());
});
listSource.forEach(person -> System.out.println(person.getUsername() + ", " + person.getAge()));
}
/**
*
* @param userName 待匹配参数
* @param lists 源数据
* @param biFunction 操作函数
* @return 返回结果
*
* 我认为方法就应该这样子去写。如何制定规则交给调用者,而不是制定者。
*/
public List<Person> getListByUsername(String userName, List<Person> lists, BiFunction<String,List<Person>, List<Person>> biFunction) {
return biFunction.apply(userName,lists);
};
}
下次再继续梳理,上面的代码最后一个我自己都感动了,差点落泪。