Stream接口

Posted 技术很low的瓜贼

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Stream接口相关的知识,希望对你有一定的参考价值。

文章目录

Stream接口

一、概念

  • java.util.stream.Stream接口是对集合功能的增强,可以对集合元素进行复杂的查找、过滤、筛选等操作
  • Stream接口借助于Lambda 表达式极大的提高编程效率和程序可读性,同时它提供串行和并行两种模式进行汇聚操作,并发模式能够充分利用多核处理器的优势

二、创建方式

  • 方式一:通过调用集合的默认方法来获取流
  • 方式二:通过数组工具类中的静态方法来获取流
  • 方式三:通过Stream接口的静态方法来获取流
  • 方式四:通过Stream接口的静态方法来获取流

三、中间操作

  • 筛选与切片的常用方法
方法功能
Stream filter(Predicate<? super T> predicate)返回一个包含匹配元素的流
Stream distinct()返回不包含重复元素的流
Stream limit(long maxSize)返回不超过给定元素数量的流
Stream skip(long n)返回丢弃前n个元素后的流
  • 映射的常用方法
方法功能
Stream map(Function<? super T,? extends R>mapper)返回每个处理过元素组成的流
Stream flatMap(Function<? super T,? extends Stream<? extends R>> mapper)返回每个被替换过元素组成的流,并将所有流合成一个流
  • 排序的常用方法
方法功能
Stream sorted()返回经过自然排序后元素组成的流
Stream sorted(Comparator<? super T> comparator)返回经过比较器排序后元素组成的流

四、终止操作

  • 匹配与查找的常用方法
方法功能
Optional findFirst()返回该流的第一个元素
boolean allMatch(Predicate<? super T> predicate)返回所有元素是否匹配
boolean noneMatch(Predicate<? super T> predicate)返回没有元素是否匹配
Optional max(Comparator<? super T> comparator)根据比较器返回最大元素
Optional min(Comparator<? super T> comparator)根据比较器返回最小元素
long count()返回元素的个数
void forEach(Consumer<? super T> action)对流中每个元素执行操作
  • 约束的常用方法
方法功能
Optional reduce(BinaryOperator accumulator)返回结合后的元素值
  • 收集的常用方法
方法功能
<R,A> R collect(Collector<? super T,A,R> collector)使用收集器对元素进行处理

五、实现代码

  • 实体类
public class Person implements Comparable<Person>

    private String name;
    private int age;

    public Person() 
    

    @Override
    public boolean equals(Object o) 
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Person person = (Person) o;
        return age == person.age && Objects.equals(name, person.name);
    

    @Override
    public int hashCode() 
        return Objects.hash(name, age);
    

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

    public void show() 
        System.out.println("方法引用案例");
    
    @Override
    public String toString() 
        return "Person" +
                "name='" + name + '\\'' +
                ", age=" + 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;
    

    @Override
    public int compareTo(Person o) 
        return getAge() - o.getAge();
    


  • 实现类
public class StreamTest 

    /**
     * 1.使用传统方式过滤,并打印
     */
    public static void test1() 
        List<Person> list1 = new ArrayList();
        list1.add(new Person("zhangsan", 21));
        list1.add(new Person("lisi", 25));
        list1.add(new Person("wangwu", 16));
        list1.add(new Person("zhaoliu", 21));
        list1.add(new Person("sunqi", 17));

        // 1.使用传统方式过滤未成年人,并打印
        List<Person> list2 = new ArrayList<>();
        for (Person person : list1) 
            if (person.getAge() > 18) 
                list2.add(person);
            
        
        for (Person person : list2) 
            System.out.println(person);
        
    

    /**
     * 2.通过调用集合的默认方法来获取流来过滤
     * filter方法
     */
    public static void test2() 
        List<Person> list1 = new ArrayList();
        list1.add(new Person("zhangsan", 21));
        list1.add(new Person("lisi", 25));
        list1.add(new Person("wangwu", 16));
        list1.add(new Person("zhaoliu", 21));
        list1.add(new Person("sunqi", 17));

        list1.stream().filter(new Predicate<Person>() 
            @Override
            public boolean test(Person person) 
                return person.getAge() > 18;
            
        ).forEach(new Consumer<Person>() 
            @Override
            public void accept(Person person) 
                System.out.println(person);
            
        );

        // Lambda方式
        list1.stream().filter(person -> person.getAge() > 18).forEach(person -> System.out.println(person));

        // 引用方式
        list1.stream().filter(person -> person.getAge() > 18).forEach(System.out::println);
    

    /**
     * Stream distinct()方法
     * 实体对象的去重必须重写equals和hashcode方法
     */
    public static void test3() 
        List<Person> list1 = new ArrayList();
        list1.add(new Person("zhangsan", 21));
        list1.add(new Person("lisi", 25));
        list1.add(new Person("wangwu", 16));
        list1.add(new Person("zhaoliu", 21));
        list1.add(new Person("sunqi", 17));
        list1.add(new Person("sunqi", 17));
        list1.stream().distinct().forEach(new Consumer<Person>() 
            @Override
            public void accept(Person person) 
                System.out.println(person);
            
        );
        // Lambda方式
        list1.stream().distinct().forEach(person -> System.out.println(person));

        // 引用方式
        list1.stream().distinct().forEach(System.out::println);

    

    /**
     * Stream limit
     */
    public static void test4() 
        List<Person> list1 = new ArrayList();
        list1.add(new Person("zhangsan", 21));
        list1.add(new Person("lisi", 25));
        list1.add(new Person("wangwu", 16));
        list1.add(new Person("zhaoliu", 21));
        list1.add(new Person("sunqi", 17));
        list1.stream().limit(3).forEach(new Consumer<Person>() 
            @Override
            public void accept(Person person) 
                System.out.println(person);
            
        );

        // Lambda方式
        list1.stream().limit(3).forEach(person -> System.out.println(person));
        // 引用方式
        list1.stream().limit(3).forEach(System.out::println);
    

    /**
     * Stream skip
     */
    public static void test5() 
        List<Person> list1 = new ArrayList();
        list1.add(new Person("zhangsan", 21));
        list1.add(new Person("lisi", 25));
        list1.add(new Person("wangwu", 16));
        list1.add(new Person("zhaoliu", 21));
        list1.add(new Person("sunqi", 17));
        list1.stream().skip(2).forEach(new Consumer<Person>() 
            @Override
            public void accept(Person person) 
                System.out.println(person);
            
        );

        // Lambda方式
        list1.stream().skip(2).forEach(person -> System.out.println(person));
        // 引用方式
        list1.stream().skip(2).forEach(System.out::println);
    

    /**
     * Stream map
     */
    public static void test6() 
        List<Person> list1 = new ArrayList();
        list1.add(new Person("zhangsan", 21));
        list1.add(new Person("lisi", 25));
        list1.add(new Person("wangwu", 16));
        list1.add(new Person("zhaoliu", 21));
        list1.add(new Person("sunqi", 17));

        list1.stream().map(new Function<Person, Object>() 
            @Override
            public Object apply(Person person) 
                return person.getName();
            
        ).forEach(new Consumer<Object>() 
            @Override
            public void accept(Object o) 
                System.out.println(o);
            
        );

        // Lambda
        list1.stream().map(person -> person.getName()).forEach(o -> System.out.println(o));

        // 引用
        list1.stream().map(Person::getName).forEach(System.out::println);
    

    /**
     * Stream sorted
     */
    public static void test7() 
        List<Person> list1 = new ArrayList();
        list1.add(new Person("zhangsan", 21));
        list1.add(new Person("lisi", 25));
        list1.add(new Person("wangwu", 16));
        list1.add(new Person("zhaoliu", 21));
        list1.add(new Person("sunqi", 17));

        list1.stream().sorted().forEach(new Consumer<Person>() 
            @Override
            public void accept(Person person) 
                System.out.println(person);
            
        );

        // Lambda
        list1.stream().sorted().forEach(person -> System.out.println(person));

        // 引用
        list1.stream().sorted().forEach(System.out::println);
    

    /**
     * Stream sorted(Comparator<? super T> comparator)
     */
    public static void test8() 
        List<Person> list1 = new ArrayList();
        list1.add(new Person("zhangsan", 21));以上是关于Stream接口的主要内容,如果未能解决你的问题,请参考以下文章

Stream流

java中的Stream流

Java Stream流式思想

Java基础-Stream流方法引用篇

Java8 Stream介绍

Java8 Stream介绍