Java 8 API 流Stream

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/maguoliang110/article/details/83000421

Stream 使用一种类似用 SQL 语句从数据库查询数据的直观方式来提供一种对 Java 集合运算和表达的高阶抽象。
Stream API可以极大提高Java程序员的生产力,让程序员写出高效率、干净、简洁的代码。
这种风格将要处理的元素集合看作一种流, 流在管道中传输, 并且可以在管道的节点上进行处理, 比如筛选, 排序,聚合等。
元素流在管道中经过中间操作(intermediate operation)的处理,最后由最终操作(terminal operation)得到前面处理的结果。

什么是 Stream?
Stream(流)是一个来自数据源的元素队列并支持聚合操作
元素是特定类型的对象,形成一个队列。 Java中的Stream并不会存储元素,而是按需计算。
数据源 流的来源。 可以是集合,数组,I/O channel, 产生器generator 等。
聚合操作 类似SQL语句一样的操作, 比如filter, map, reduce, find, match, sorted等。
和以前的Collection操作不同, Stream操作还有两个基础的特征:
Pipelining: 中间操作都会返回流对象本身。 这样多个操作可以串联成一个管道, 如同流式风格(fluent style)。 这样做可以对操作进行优化, 比如延迟执行(laziness)和短路( short-circuiting)。
内部迭代: 以前对集合遍历都是通过Iterator或者For-Each的方式, 显式的在集合外部进行迭代, 这叫做外部迭代。 Stream提供了内部迭代的方式, 通过访问者模式(Visitor)实现。

下面是应用例子:


import java.awt.*;
import java.lang.reflect.Array;
import java.util.*;
import java.util.List;
import java.util.stream.Collectors;

public class Test003 {
    public static void main(String[] args) {


        List<Person> listPerson = Arrays.asList(new Person(10, "tomo"), new Person(29, "jerry")
                , new Person(25, "katty"));
        System.out.println("-----------1.过滤年龄是10的人的信息,显示其他人信息--------------");
        List<Person>  resultlist = listPerson.stream().filter(person -> 10 != person.getAge()).collect(Collectors.toList());
        resultlist.forEach(person -> {
            System.out.println(person.getName());
            System.out.println(person.getAge());
        });
        System.out.println("-----------2.拼接集合中人的姓名--------------");

        String splitename = listPerson.stream().map(Person :: getName).collect(Collectors.joining(","));
        System.out.println(splitename);

        splitename = listPerson.stream().map(Person :: getName).collect(Collectors.joining());
        System.out.println(splitename);

        splitename = listPerson.stream().map(Person :: getName).collect(Collectors.joining("," ,"[", "]"));
        System.out.println(splitename);

        System.out.println("-----------3.查询年龄是21岁的人的姓名【有就显示姓名 否则输出null】--------------");
        String name =  listPerson.stream().filter(person -> 21 == person.getAge()).map(Person :: getName).findAny().orElse(null);
        System.out.println(name);
        System.out.println("-----------4.查询年龄是29岁的人的姓名--------------");
        name =  listPerson.stream().filter(person -> 29 == person.getAge()).map(Person :: getName).findAny().orElse(null);
        System.out.println("-----------5.查询年龄最大的人的姓名--------------");
        listPerson.stream().collect(Collectors.maxBy(Comparator.comparingInt(Person :: getAge))).map(Person :: getName).ifPresent(System.out::println);
        System.out.println("-----------6.查询年龄最大的人信息--------------");
        Optional<Person> result2 = listPerson.stream().collect(Collectors.minBy(Comparator.comparing(Person :: getAge))) ;
        if (result2.isPresent()) {
            Person person = result2.get();
            System.out.println(person.getAge());
            System.out.println(person.getName());

        }
        System.out.println("----------根据年龄排序【正序】---------------");
        List<Person> list =  listPerson.stream().sorted((x,y) -> x.getAge() - y.getAge()).collect(Collectors.toList());
        list.forEach(person -> System.out.println(person.getAge()));
        System.out.println("-------------------------");




    }
}


class Person {

    private String name;
    private int age;


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Person(int age , String name) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}


 

猜你喜欢

转载自blog.csdn.net/maguoliang110/article/details/83000421