java8新特性之Stream

Stream 不能被重用,一旦它被使用或使用,流将被关闭

一、创建流的方式

1、通过Collection接口方法:default Stream<E> stream()

    Stream<String> stream = list.stream();

2、通过Stream接口

  2.1  public static<T> Stream<T> of(T... values)    产生一个元素为给定值的流

String[] split = dbsetting.split("\PL+");
Stream<String> split1 = Stream.of(split);

  2.2 public static<T> Stream<T> generate(Supplier<T> s)    产生一个无限流,它的值是通过反复调用函数s而构建的。

Stream.generate(Math::random).forEach(x-> System.out.println(x));

  2.3  public static<T> Stream<T> iterate(final T seed, final UnaryOperator<T> f)      产生一个无限流,它的元素包含种子,在种子上调用f产生的值,在前一个元素上调用f产生的值

Stream.iterate(0, n -> n + 1).limit(10).forEach(x -> System.out.println(x));

3、通过Arrays类的方法:public static <T> Stream<T> stream(T[] array)

String[] split = dbsetting.split("\PL+");
Arrays.stream(split).forEach(x-> System.out.println(x));

4、通过Files类的方法 : public static Stream<String> lines(Path path, Charset cs) 

Stream<String> lines1 = Files.lines(Paths.get("D://dbsetting.txt"),Charset.forName("GBK"));
ines1.forEach(x-> System.out.println(x));

二、流转换产生新的流

1、Stream<T> filter(Predicate<? super T> predicate);    原元素与某种条件匹配 产生新元素

 String[] split = dbsetting.split("\PL+");
 Stream<String> stringStream = Arrays.stream(split).filter(x -> x.length() > 0);

2、public static <T> Stream<T> stream(T[] array)    按某种方式转换原元素的值来产生新元素

String[] split = dbsetting.split("\PL+");
Arrays.stream(split).map(String::toUpperCase).forEach(x-> System.out.println(x));

3、Stream<T> limit(long maxSize);       limit方法返回一个新流,第n个元素结束 

   Stream<T> skip(long n);       丢弃前n个元素

Stream.iterate(0, n -> n + 1).limit(10).forEach(x -> System.out.println(x));

4、public static <T> Stream<T> concat(Stream<? extends T> a, Stream<? extends T> b)          流拼接

String[] array = {"a", "b", "c"};
String[] array2 = {"d", "e"};
Stream.concat(Arrays.stream(array), Stream.of(array2)).forEach(x-> System.out.println(x));

5、Stream<T> distinct();       剔除重复元素

Stream.of("aa","nn","cc","dd","aa","bb").distinct().forEach(x-> System.out.println(x));

6、Stream<T> sorted();   排序

Stream.of("aa","nnn","c","dd","aaaa","bb").sorted().forEach(x-> System.out.println(x));
        Stream.of("aa","nnn","c","dd","aaaa","bb").sorted(Comparator.comparing(String::length)).forEach(x-> System.out.println(x));

7、Stream<T> peek(Consumer<? super T> action);     每次获取元素时都会调用一个函数

Object[] names =  Stream.of("aa", "bb", "cc").peek(x -> System.out.println("获取元素:" + x)).limit(2).toArray();

三、简单简约

        boolean anyMatch = Stream.of("aa", "bb", "cc", "a").anyMatch(x -> x.length() < 1);
        boolean allMatch = Stream.of("aa", "bb", "cc", "a").allMatch(x -> x.length() > 1);
        boolean noneMatch = Stream.of("aa", "bb", "cc", "a").noneMatch(x -> x.length() > 2);
        System.out.println(anyMatch);
        System.out.println(allMatch);
        System.out.println(noneMatch);
        Optional<String> max = Stream.of("aa", "bb", "cc", "a","aad").max(Comparator.comparing(String::length));
        System.out.println("max:"+max.get());
        Optional<String> min = Stream.of("aa", "bb", "cc", "a","aad").min(Comparator.comparing(String::length));
        System.out.println("min:"+min.get());
        Optional<String> any = Stream.of("aa", "bb", "cc", "a", "aad").findAny();
        Optional<String> first = Stream.of("aa", "bb", "cc", "a", "aad").findFirst();
        System.out.println("any:" + any.get());
        System.out.println("first:" + first.get());  

 

四、收集结果

        Object[] objects = Stream.of("aa", "bb", "cc", "a").toArray();
        List<String> collect = Stream.of("aa", "bb", "cc", "a").collect(Collectors.toList());
        Set<String> collect1 = Stream.of("aa", "bb", "cc", "a").collect(Collectors.toSet());
        TreeSet<String> collect2 = Stream.of("aa", "bb", "cc", "aa").collect(Collectors.toCollection(TreeSet::new));
        String collect3 = Stream.of("aa", "bb", "cc", "a").collect(Collectors.joining("---"));

        Employee wxh = new Employee("wxh", 5345.2);
        Employee www = new Employee("www", 1345.2);
        Employee aaa = new Employee("aaa2", 2345.2);
        Employee aaa2 = new Employee("aaa1", 2345.2);
        List<Employee> employees = Stream.of(wxh, www, aaa, aaa2).collect(Collectors.toList());
        Map<String, Double> employeesSalary = employees.stream().collect(Collectors.toMap(Employee::getName, Employee::getSalary));
        Map<String, Employee> collect4 = employees.stream().collect(Collectors.toMap(Employee::getName, e -> e, (o, n) -> n));
        TreeMap<String, Employee> collect5 = employees.stream().collect(Collectors.toMap(x->x.getName(), e -> e, (o, n) -> n, TreeMap::new));  

  

五、分组

        Locale[] availableLocales = Locale.getAvailableLocales();
        //groupingBy   根据国家分组
        Map<String, List<Locale>> collect1 =     Arrays.stream(availableLocales).collect(groupingBy(Locale::getCountry));
        //groupingBy  toset  根据国家分组,分组用set类型
        Map<String, Set<Locale>> collect = Arrays.stream(availableLocales).collect(Collectors.groupingBy(Locale::getCountry, toSet()));
        //counting()  对分组后的元素计数
        Map<String, Long> collect2 = Arrays.stream(availableLocales).collect(groupingBy(Locale::getCountry, counting()));
        Employee wxh = new Employee("wxh", 1111,"salary");
        Employee www = new Employee("www", 2222,"salary");
        Employee aaa = new Employee("aaa", 3333,"salary");
        Employee aaa2 = new Employee("aaa", 2222,"bonus");
        Employee www2 = new Employee("www", 5555,"bonus");
        //summingDouble   对分组后的元素进行计算然后返回计算结果
        Map<String, Double> collect3 = Stream.of(wxh, www, aaa, aaa2, www2).collect(groupingBy(Employee::getName, summingDouble(Employee::getSalary)));
        //maxBy   对分组后的元素计算最大值,返回最大值对应的元素
        Map<String, Optional<Employee>> collect4 = Stream.of(wxh, www, aaa, aaa2, www2).collect(
                groupingBy(Employee::getName, maxBy(Comparator.comparing(Employee::getSalary))));
        //mapping   
        Map<String, Optional<String>> collect5 = Stream.of(wxh, www, aaa, aaa2, www2).collect(groupingBy(Employee::getName,
                mapping(Employee::getSalaryclass, maxBy(Comparator.comparing(String::length,Comparator.reverseOrder())))));
        Map<String, Set<Double>> collect6 = Stream.of(wxh, www, aaa, aaa2, www2).collect(groupingBy(Employee::getName, mapping(Employee::getSalary, toSet())));
        Map<String, String> collect7 = Stream.of(wxh, www, aaa, aaa2, www2).collect(groupingBy(Employee::getName, mapping(Employee::getSalaryclass, joining(","))));

  

原文地址:https://www.cnblogs.com/yaohuiqin/p/13209157.html