Java8新特性——Stream

来源:互联网 发布:osmo和gopro 知乎 编辑:程序博客网 时间:2024/04/30 00:16

1、Stream在Java8中被定义为泛型接口
2、Stream接口代表数据流。
3、Stream不是一个数据结构,不直接存储数据。
4、Stream通过管道操作数据。
5、创建Stream接口实现类对象:
stream():创建一个Stream接口实现类的对象。
例如:
Stream stream=people.stream();

一、管道:代表一个操作序列。
二、管道包含以下组件:
1、数据集:可能是集合、数组等。
2、零个或多个中间业务。如过滤器
3、一个终端操作,如的forEach

1、过滤器:用给定的条件在源数据基础上过滤出新的数据,并返回一个Stream对象。
2、过滤器包含匹配的谓词。
例如:判断p对象是否为男性的lambda表达式:
Stream stream=people.stream();
stream=stream.filter(p->p.getGender()==‘男’);

【案例】创建一个元素为Person类的集合:people
使用Stream和forEach显示该集合所有元素。

   public static void main(String[] args) {        List<Person> people = createPeople();        Stream<Person> stream = people.stream();        stream.forEach(person -> System.out.println(person.toString()));    }    static List<Person> createPeople() {        List<Person> tempList = new ArrayList<Person>();        for (int i = 0; i < 10; i++) {            Person p = new Person("张飞" + i, Person.Sex.FEMALE, 10 + i, 180 + i);            if (i % 2 == 0) {                p.setGender(Person.Sex.MALE);            }            tempList.add(p);        }        return tempList;    }输入:Person{name='张飞0', gender=MALE, age=10, height=180}Person{name='张飞1', gender=FEMALE, age=11, height=181}Person{name='张飞2', gender=MALE, age=12, height=182}Person{name='张飞3', gender=FEMALE, age=13, height=183}Person{name='张飞4', gender=MALE, age=14, height=184}Person{name='张飞5', gender=FEMALE, age=15, height=185}Person{name='张飞6', gender=MALE, age=16, height=186}Person{name='张飞7', gender=FEMALE, age=17, height=187}Person{name='张飞8', gender=MALE, age=18, height=188}Person{name='张飞9', gender=FEMALE, age=19, height=189}

【案例】创建一个元素为Person类的集合:people
使用Stream、filter和forEach显示该集合中所有女性。

        List<Person> people = createPeople();        Stream<Person> stream = people.stream();        stream.filter(person -> person.getGender()==(Person.Sex.FEMALE)).forEach(person -> System.out.println(person.toString()));    }    static List<Person> createPeople() {        List<Person> tempList = new ArrayList<Person>();        for (int i = 0; i < 10; i++) {            Person p = new Person("张飞" + i, Person.Sex.FEMALE, 10 + i, 180 + i);            if (i % 2 == 0) {                p.setGender(Person.Sex.MALE);            }            tempList.add(p);        }        return tempList;    }输出:Person{name='张飞1', gender=FEMALE, age=11, height=181}Person{name='张飞3', gender=FEMALE, age=13, height=183}Person{name='张飞5', gender=FEMALE, age=15, height=185}Person{name='张飞7', gender=FEMALE, age=17, height=187}Person{name='张飞9', gender=FEMALE, age=19, height=189}

DoubleStream接口

一、DoubleStream接口表示元素类型是double的数据源。
二、DoubleStream接口的常用方法:
1、 max().getAsDouble():获取流中数据集的最大值。
2、stream.min().getAsDouble() :获取流中数据集的最小值。
3、stream.average() :获取流中数据集的平均值。
三、获取DoubleStream
集合变量.mapToDouble()

【案例】统计people集合中姓名中包含“飞”字的平均身高。

    public static void main(String[] args) {        List<Person> people = createPeople();        Stream<Person> stream = people.stream();        double height = stream.filter(person -> person.getName().contains("飞")).mapToDouble(person -> person.getHeight()).average().getAsDouble();        System.out.println("所有名字包含飞字的人的平均身高:" + height);    }    static List<Person> createPeople() {        List<Person> tempList = new ArrayList<Person>();        for (int i = 0; i < 10; i++) {            Person p = new Person("张飞" + i, Person.Sex.FEMALE, 10 + i, 180 + i);            if (i % 2 == 0) {                p.setGender(Person.Sex.MALE);            }            tempList.add(p);        }        return tempList;    }输出:所有名字包含飞字的人的平均身高:184.5
0 0
原创粉丝点击