java8Stream 介绍
在java8 之前我们想要过滤一个列表里面的数据怎么做了?
没错,就是这样。也是十分的简单。就是用一个循环遍历,筛选然后在返回。
/**
* 在java8之前过滤一个list需要怎么做
* @param <T>
* @param list
*/
private static <T> List<T> beforeJava8FilterList(List<T> list,T filterEle) {
List<T> result = new ArrayList<>();
for (T t : list) {
if(filterEle.equals(t)) continue;
result.add(t);
}
return result;
}
但是到了java8 我们可以这样
The equivalent example in Java 8, stream.filter() to filter a List, and collect() to convert a stream into a List.
利用 stream.filter()来过滤一个list,再利用collect()来将一个stream 转换位一个集合。
于是我们的代码可以这样写!!!!
/**
* 在java8 我们是如何过滤一个list
* @param <T>
* @param list
* @param filterEle
* @return
*/
private static <T> List<T> inJava8FilterList(List<T> list,T filterEle) {
return list.stream().filter(x->!filterEle.equals(x)).collect(Collectors.toList());
}
接下来我们好好学习一下stream的filter(), findAny() and orElse()
准备类:
在java8之前想通过name 找出list中的一个对像时我怎么做?
private static Person findPersonByNameBeforeJava8(List<Person> list,String targetName) {
for (Person person : list) {
if(targetName.equals(person.getName()))
return person;
}
return null;
}
没错就是利用循环遍历匹配。
当到了java8我们可以这样做
Person result1 = persons.stream() // Convert to steam
.filter(x -> "jack".equals(x.getName())) // we want "jack" only
.findAny() // If 'findAny' then return found
.orElse(null); // If not found, return null
想法是:通过stream.fllter(将我们的目标对象拦截出来),通过findAny方法进行判断如果找出来就返回,如果没有找到就利用.orElse(null)返会一个null出来。
当然filter也支持多条件的加持。eg
.filter((p) -> "jack".equals(p.getName()) && 20 == p.getAge())
or
.filter(p -> {
if ("jack".equals(p.getName()) && 20 == p.getAge()) {
return true;
}
return false;
})
Streams filter() and map()
String name = persons.stream()
.filter(x -> "jack".equals(x.getName()))
.map(Person::getName) //convert stream to String
.findAny()
.orElse("");
System.out.println("name : " + name);
List<String> collect = persons.stream()
.map(Person::getName)
.collect(Collectors.toList());
collect.forEach(System.out::println);
output
name : jack
mkyong
jack
lawrence
map做的工作更像是对其进行了类型转换。关于map()跟多的用法我将在下一篇文章进行介绍。