Java8新特性——Stream

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值