需求
现在有这么一个需求,在一个list数组里面存了一些数据,我想要取出特定条件下的数据。比如我想取出学生的年龄在10岁以上的,再比如想取出张三这个人的一些信息。
思路解决
如果想要拿到一组list中的一些数据,就是对数据进行一些筛选,我们的原生方法就是遍历list数组,然后作判断,拿出相应条件的数据。这是一种很麻烦的方法,所以在Java 8 就出现了一种很简单的方法,过滤器。只需要很简单的一行,就可以拿到你想要的数据。
具体代码讲解
package com.cc;
public class Person {
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
package com.cc;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
public class streamTest {
public static void main(String[] args) {
Person[] person = {new Person("moon",18), new Person("cc",3)};
//将数组转成list
List<Person> list = Arrays.asList(person);
//一个条件筛选
Person result1 = list.stream().filter(p -> "moon".equals(p.getName()))
.findAny().orElse(null);//如果找不到数据会返回null。orElse()是设置找不到数据后的默认值。
System.out.println(result1.getName()); //moon
//多个条件筛选
Person result2 = list.stream().filter(p -> "oo".equals(p.getName()) && 18 == p.getAge())
.findAny().orElse(new Person("liang", 20));
System.out.println(result2.getName()); //liang
String name = list.stream().filter(p -> "moon".equals(p.getName())).map(Person::getName)
.findAny().orElse(""); // moon
System.out.println(name);
List<String> names = list.stream().filter(p -> "moon".equals(p.getName())).map(Person::getName)
.collect(Collectors.toList());
names.forEach(System.out::println); //moon
}
}
总结
使用过滤器很容易就可以选出符合特定条件的数据,并且还减少了代码量。
补充
现在想提取出来name这一列,那么应该怎么做呢?
List<String> nameList = list.stream().map(Person::getName).collect(Collectors.toList());