Streams 过滤器


演示使用流的filter(),collect(),findAny()和orElse()


使用list过滤

public List<Student> getStudents(){
List<Student> result = new ArrayList<>();
result.add(new Student(1,"小易","21"));
result.add(new Student(2,"小二","23"));
result.add(new Student(4,"小思","24"));
result.add(new Student(3,"小三","24"));
return result;
}

@Test
public void StreamsFilterTest() {
List<Student> studentList = getFilterOutput(getStudents(), "小三");
System.out.println("把小三给我过滤掉====>"+studentList);
}

public List<Student> getFilterOutput(List<Student> liens ,String filter){
List<Student> result = new ArrayList<>();
for (Student student : liens) {
//过滤你想过滤掉的学生
if (!filter.equals(student.getName())){
result.add(student);
}
}
return result;
}

Streams 过滤器_sed

使用stream.filter()


stream.filter()来过滤List,并collect()以流转换为List


@Test
public void StreamsFilterTest() {
List<Student> studentList = getStudents().stream()
.filter(student -> !"小三".equals(student.getName()))
.collect(Collectors.toList());
studentList.forEach(student-> System.out.println("把小三给我剔除了---->"+student));
}

Streams 过滤器_sed_02

Streams filter(), findAny() and orElse()


1.8之前


public List<Student> getStudents(){
List<Student> result = new ArrayList<>();
result.add(new Student(1,"小易","21"));
result.add(new Student(2,"小二","23"));
result.add(new Student(4,"小思","24"));
result.add(new Student(3,"小三","24"));
return result;
}

@Test
public void StreamsFilterTest() {
Student studentByName = getStudentByName(getStudents(), "小三");
System.out.println(studentByName);
}

public Student getStudentByName(List<Student> students,String name){
Student student = null;
for (Student studentTemp : students) {
if (name.equals(studentTemp.getName())){
student = studentTemp;
}
}
return student;
}

Streams 过滤器_java_03


1.8之后可以用


public List<Student> getStudents(){
List<Student> result = new ArrayList<>();
result.add(new Student(1,"小易","21"));
result.add(new Student(2,"小二","23"));
result.add(new Student(4,"小思","24"));
result.add(new Student(3,"小三","24"));
return result;
}

@Test
public void StreamsFilterTest() {
Student streamsFilterStudent = StreamsFilterStudent("小三");
System.out.println(streamsFilterStudent);
}

public Student StreamsFilterStudent(String name){
return getStudents().stream()
.filter(student -> name.equals(student.getName()))
.findAny()
.orElse(null);//如果没有返回null
}

Streams 过滤器_sed_04

多条件判断

public List<Student> getStudents(){
List<Student> result = new ArrayList<>();
result.add(new Student(1,"小易","21"));
result.add(new Student(2,"小二","23"));
result.add(new Student(4,"小二","24"));
result.add(new Student(3,"小二","24"));
return result;
}

@Test
public void StreamsFilterTest() {
Student streamsFilterStudent = StreamsFilterStudent();
System.out.println(streamsFilterStudent);
System.out.println("==============================");
System.out.println(StreamsFilterStudents());
}

public Student StreamsFilterStudent(){
return getStudents().stream()
.filter(student -> {
if (student != null && "24".equals(student.getAge())) {
return true;
}return false;
})
.findAny()
.orElse(null);//如果没有返回null
}

public Student StreamsFilterStudents(){
return getStudents().stream()
.filter(student -> {
if (student != null && "21".equals(student.getAge())) {
return true;
}
return false;
})
.findAny()
.orElse(null);//如果没有返回null
}

Streams 过滤器_java_05

stream和map


如果使用map它返回的类型是Stirng


public List<Student> getStudents(){
List<Student> result = new ArrayList<>();
result.add(new Student(1,"小易","21"));
result.add(new Student(2,"小二","23"));
result.add(new Student(4,"小二","24"));
result.add(new Student(3,"小二","24"));
return result;
}

@Test
public void StreamsFilterTest() {
String studentName = StreamsFilterStudent("小二");
System.out.println("名字====>"+studentName);

}

public String StreamsFilterStudent(String name){

String studentName = getStudents().stream()
.filter(student -> name.equals(student.getName()))
.map(Student::getName)
.findAny()
.orElse(null);//如果没有返回null
System.out.println(studentName);
return studentName;
}

Streams 过滤器_sed_06

stream和list

public List<Student> getStudents(){
List<Student> result = new ArrayList<>();
result.add(new Student(1,"小易","21"));
result.add(new Student(2,"小二","23"));
result.add(new Student(4,"小二","24"));
result.add(new Student(3,"小二","24"));
return result;
}

@Test
public void StreamsFilterTest() {
List studentName = StreamsFilterStudent("小二");
System.out.println("名字====>"+studentName);

}

public List StreamsFilterStudent(String name){
List<String> studentList = getStudents().stream()
.map(Student::getName)
.limit(1)//可以指定返回多少条
.collect(Collectors.toList());

// studentList.forEach(s -> System.out.println(s));
studentList.forEach(System.out::println);
return studentList;
}

Streams 过滤器_oracle_07

具体可参照oracle
​​​https://www.oracle.com/technical-resources/articles/java/ma14-java-se-8-streams.html​

并行流


打印数字 可以看到到时按照顺序排序打印下来的


public static void main(String[] args) {
System.out.println("normal");
IntStream range = IntStream.rangeClosed(1, 100);
range.forEach(System.out::println);

System.out.println("parallel");
IntStream intStream = IntStream.rangeClosed(1, 99);
intStream.forEach(System.out::println);
}


打印26个字母


@Test
public void getDataTest(){
List<String> data = getData();
data.stream().forEach(System.out::println);
}

public List<String> getData(){
List<String> data = new ArrayList<>();
int n = 97; //97=a 122=z
while (n<=122){
char c = (char) n;
data.add(String.valueOf(c));
n++;
}
return data;
}

Stream 是否以并行模式运行


可以是用paraller


public static void main(String[] args) {
System.out.println("normal");
IntStream range = IntStream.rangeClosed(1, 100);
range.forEach(System.out::println);

System.out.println("parallel");
IntStream intStream = IntStream.rangeClosed(1, 99);
IntStream parallel = intStream.parallel();
System.out.println(parallel.isParallel());//true为开启
parallel.forEach(System.out::println);
}


可加入线程名


public static void main(String[] args) {
System.out.println("normal");
IntStream range = IntStream.rangeClosed(1, 100);
range.forEach(p->{
System.out.println("Thread : "+ Thread.currentThread().getName() + " "+ p);
});

System.out.println("parallel");
IntStream intStream = IntStream.rangeClosed(1, 99);
IntStream parallel = intStream.parallel();
System.out.println(parallel.isParallel());//true为开启
parallel.forEach(p->{
System.out.println("Thread : "+Thread.currentThread().getName() + " "+ p);
});
}

@Test
public void getDataTest(){
List<String> data = getData();
data.stream().forEach(System.out::println);
}

public List<String> getData(){
List<String> data = new ArrayList<>();
int n = 97; //97=a 122=z
while (n<=122){
char c = (char) n;
data.add(String.valueOf(c));
n++;
}
return data;
}


待更新