zoukankan      html  css  js  c++  java
  • Java8新特性3 Stream

    https://blog.csdn.net/y_k_y/article/details/84633001

    (1)概念

    Stream 是 Java8 中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API 对集合数据进行操作,就类似于使用 SQL 执行的数据库查询。也可以使用 Stream API 来并行执行操作。简而言之,Stream API 提供了一种高效且易于使用的处理数据的方式。

    特点:

            1 . 不是数据结构,不会保存数据。

            2. 不会修改原来的数据源,会产生一个新流

            3. 惰性求值,流在中间处理过程中,只是对操作进行了记录,并不会立即执行,需要等到执行终止操作的时候才会进行实际的计算。

    集合关注的是数据,流关注的是计算。 

    (2)操作

    1. 创建Stream:一个数据源(集合、数组),获取一个流。
    2. 中间操作:对数据源的数据进行处理。
    3. 终止操作:产生结果。
    package Stream;

    import org.junit.Test;

    import java.util.*;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;

    /**
    * @autour zdc
    * @create 2020-03-20-22:45
    */
    public class _1Test {
    private List<Person> people = Arrays.asList(
    new Person("zd2",11,22.3), new Person("zd2",11,22.3),
    new Person("zdi",12,11d),new Person("zdi",12,11d),
    new Person("zdt",113,222.3),
    new Person("zdf",114,22.33),
    new Person("zdf",117,22.3),
    new Person("zddsd",8,22.3),
    new Person("zdcfff",1100,22.3)
    );

    @Test
    public void test1(){
    //1.通过Collection提供的stream()或parrallelStream()方法
    List<String> list = new ArrayList<>();
    Stream<String> stream = list.stream();

    //2.通过Arrays的stream()
    Person[] people = new Person[10];
    Stream<Person> stream1 = Arrays.stream(people);

    //3.通过Stream类中的静态方法of()
    Stream<String> stream2 = Stream.of("aa", "bb", "cc");

    //4.创建无限量
    //迭代
    Stream.iterate(0, x -> x + 2).limit(10).forEach(System.out::println);

    //
    Stream.generate(()->Math.random()).limit(10).forEach(System.out::println);

    }

    /*
    * 中间操作 :多个中间操作可以连接成一个流水线,而在终止操作一次性执行全部,叫做惰性求值。
    * filter(Predicate p) 过滤流
    * skip(long maxSize) 跳过前几个元素,若流中元素不足n个,返回一个空流
    * distinct 删除重复元素(比较hashcode equals)
    *
    * 映射:
    * map(Function f)- 接收一个函数作为参数(接收function),该函数会被应用到每个元素,并将其映射成一个新的元素
    * flapMap(Function f)- 接收一个函数作为参数,将流中的每个值都换成另一个流,然后把所有流连接成一个流。
    * flapMap接收Function,function必须返回一个Stream对象!!!!!
    *
    * 排序:
    * sorted() Comparable 某个类实现了Comparable接口,会自然排序
    * sorted(Comparator comparator) Comparator 定制排序
    *
    * 终止操作:
    * allMatch()
    * anyMatch()
    * noneMatch()
    * findFirst()
    * findAny()
    * count()
    * max(Comparator con)
    * min(Comparator con)
    * forEnch(Consumer con)
    *
    * reduce(T iden,BinaryOperator b)
    * reduce(BinaryOperator b)
    *
    * collect(Collector c)对流执行收集操作 如收集到list set map
    * */

    @Test
    public void test2(){
    List<Person> list = new ArrayList<Person>();
    //filter是中间操作 forEach是终止操作
    people.stream().filter((x)->x.getAge()<100).skip(1).distinct().forEach(p->list.add(p));
    System.out.println(list);

    //映射
    people.stream().map((person -> {
    person.setName(person.getName()+"希特勒");
    return person;
    })).forEach(System.out::println);


    Stream<Stream<Character>> stream = people.stream().map(person -> {
    //将每一个人的名字中每个字符取出来作为一个List --> Map<Stream<Character>)>
    List<Character> list1 = new ArrayList<>();
    for (Character character : person.getName().toCharArray()) {
    list1.add(character);
    }
    return list1.stream();
    });

    // stream.forEach(sm->{
    // sm.forEach(System.out::println);
    // });


    //flapMap- 接收一个函数作为参数,该函数必须返回Stream对象,将流中的每个值都换成另一个流,然后把所有流连接成一个流
    Stream<Character> characterStream = people.stream().flatMap(person -> {
    List<Character> list1 = new ArrayList<>();
    for (Character character : person.getName().toCharArray()) {
    list1.add(character);
    }
    return list1.stream();
    });
    characterStream.forEach(System.out::println);

    people.stream().sorted(Comparator.comparing(Person::getAge)).forEach(System.out::println);

    List<String> list1 = Arrays.asList("a", "sss", "ssdd", "eeff", "hwojd");
    System.out.println( list1.stream().allMatch((str) -> str.length() > 1));
    System.out.println(list1.stream().anyMatch((str)->str.startsWith("a")));
    System.out.println(list1.stream().noneMatch((str)->str.startsWith("a")));
    System.out.println(list1.stream().findFirst().get());
    System.out.println(list1.stream().findAny().get());
    System.out.println(list1.stream().count());
    System.out.println(list1.stream().max(String::compareTo));
    System.out.println(list1.stream().max(Comparator.comparingInt(String::length)));
    list1.stream().forEach(System.out::println);

    List<Integer> integers = Arrays.asList(1, 3, 5, 7, 9);
    Integer sum = integers.stream().reduce(0, (x, y) -> x + y);
    System.out.println(sum);

    Set<Integer> set = integers.stream().collect(Collectors.toSet());
    System.out.println( integers.stream().collect(Collectors.averagingInt(x->x))); //求平均值

    }
    }
  • 相关阅读:
    nodejs程序发布的jenkins自动化脚本和问题记录
    jenkins代码rsync推送脚本带日志记录和代码分机房处理示例
    django入门到精通⑥消息管理器的升级处理,对关键词进行过滤示例
    django入门到精通⑤mako模板的使用
    django入门到精通④jinja2模板的使用
    django入门到精通③template模板功能和常用标签过滤器的使用
    hdfs副本调整不生效
    macOS 系统中,开发工具列表
    查看系统中安装了哪些python版本
    -p py, --python py target interpreter for which to create a virtual (either absolute path or identifier string) 中 identifier string 的含义
  • 原文地址:https://www.cnblogs.com/zdcsmart/p/12535954.html
Copyright © 2011-2022 走看看