JAVA 8新特性stream流
Java 8 API添加了一个新的抽象称为流Stream,可以让你以一种声明的方式处理数据。
Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。
这里主要介绍几种常用的方式:
public static class Person{
private String name;
private int age;
public Person(String name, int age) {
super();
this.name=name;
this.age=age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
}
1)筛选 :即从集合中筛选出来符合自己要求的数据集合。
public static void StreamFilter(){
List<Person> list= new ArrayList<Person>();
Person person1 = new Person("zhangsan",17);
list.add(person1);
Person person11 = new Person("zhangsan",18);
list.add(person11);
Person person2 = new Person("lisi",18);
list.add(person2);
Person person3 = new Person("wangwu",19);
list.add(person3);
//filter方法进行过滤筛选操作。这里可以进行条件组合
List<Person> listPerson=list.stream().filter(s->s.name.equals("zhangsan"))
.collect(Collectors.toList());
for(Person parms : listPerson){
System.out.println("姓名:"+parms.name+" 年龄:"+parms.age);
}
}
2)排序 :根据特定条件进行排序。
//第一种
List<Person> listPerson2=list.stream().sorted((p1, p2) -> p1.age - p2.age)
.collect(Collectors.toList());
//第二种 这里也可以对 Comparator的比较方法重写实现自己想要的效果
List<Person> listPerson21=list.stream().sorted(Comparator.comparingInt(Person::getAge))
.collect(Collectors.toList());
//两种都可以进行多条件组合
3)截取 :返回前N个元素。
//这里返回前2个元素的集合
List<Person> listPerson3=list.stream().limit(2)
.collect(Collectors.toList());
4)去重 :根据条件去除重复元素。
//去除名字重复的元素
List<Person> listPerson4=list.stream().collect(
Collectors.collectingAndThen(
Collectors.toCollection(
()->new TreeSet<>(
Comparator.comparing(
Person ->Person.getName()))),ArrayList::new));
测试源码
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.TreeSet;
import java.util.stream.Collectors;
public class StreamDemo1 {
public static void main(String[] args) {
StreamFilter();
}
public static void StreamFilter(){
List<Person> list= new ArrayList<Person>();
Person person1 = new Person("zhangsan",17);
list.add(person1);
Person person11 = new Person("zhangsan",18);
list.add(person11);
Person person2 = new Person("lisi",18);
list.add(person2);
Person person3 = new Person("wangwu",19);
list.add(person3);
//筛选
List<Person> listPerson=list.stream().filter(s->s.name.equals("zhangsan")).collect(Collectors.toList());
System.out.println("------筛选姓名为 zhangsan------");
for(Person parms : listPerson){
System.out.println("姓名:"+parms.name+" 年龄:"+parms.age);
}
//排序 这里也可以使用Comparator方法进行排序,重写Comparator可进行多条件组合排序
System.out.println("------根据年龄排序------");
List<Person> listPerson2=list.stream().sorted((p1, p2) -> p1.age - p2.age)
.collect(Collectors.toList());
// List<Person> listPerson21=list.stream().sorted(Comparator.comparingInt(Person::getAge))
// .collect(Collectors.toList());
for(Person parms : listPerson2){
System.out.println("姓名:"+parms.name+" 年龄:"+parms.age);
}
//返回前N个元素
System.out.println("------返回前2个元素------");
List<Person> listPerson3=list.stream().limit(2)
.collect(Collectors.toList());
for(Person parms : listPerson3){
System.out.println("姓名:"+parms.name+" 年龄:"+parms.age);
}
//根据条件去除重复元素
System.out.println("------去除名字重复的元素------");
List<Person> listPerson4=list.stream().collect(
Collectors.collectingAndThen(
Collectors.toCollection(
()->new TreeSet<>(
Comparator.comparing(
Person ->Person.getName()))),ArrayList::new));
for(Person parms : listPerson4){
System.out.println("姓名:"+parms.name+" 年龄:"+parms.age);
}
}
public static class Person{
private String name;
private int age;
public Person(String name, int age) {
super();
this.name=name;
this.age=age;
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
}
}