zoukankan      html  css  js  c++  java
  • java8 stream基本操作集锦

    stream java8


    //对的
    String[] arrl = stack.stream().toArray(String[]::new);
    //有问题
    arrl = Stream.of(stack).toArray(String[]::new);
    

    String合并、剔除重复、排序

    String a = "xyaabbbccccdefww";
    String b = "xxxxyyyyabklmopq";
    
    System.out.println(Stream.of(a.concat(b).split(""))
            .sorted()
            .distinct()
            .collect(Collectors.joining())
    

    Stream 装箱流 (Boxed Stream)

    将对象流转换为集合:

    //It works perfect !!
    List<String> strings = Stream.of("how", "to", "do", "in", "java")
                        .collect(Collectors.toList());
    

    然而,上述过程对于基本类型流元素却不生效。

    //Compilation Error !!
    IntStream.of(1,2,3,4,5)
        .collect(Collectors.toList());
    

    构建流管道

    Collection.stream()                                使用一个集合的元素创建一个流。
    Stream.of(T...)                                    使用传递给工厂方法的参数创建一个流。
    Stream.of(T[])                                    使用一个数组的元素创建一个流。
    Stream.empty()                                    创建一个空流。
    Stream.iterate(T first, BinaryOperator<T> f)    创建一个包含序列 first, f(first), f(f(first)), ... 的无限流
    Stream.iterate(T first, Predicate<T> test, BinaryOperator<T> f)    (仅限 Java 9)类似于 Stream.iterate(T first, BinaryOperator<T> f),但流在测试预期返回 false 的第一个元素上终止。
    Stream.generate(Supplier<T> f)                    使用一个生成器函数创建一个无限流。
    IntStream.range(lower, upper)                    创建一个由下限到上限(不含)之间的元素组成的 IntStream。
    IntStream.rangeClosed(lower, upper)                创建一个由下限到上限(含)之间的元素组成的 IntStream。
    BufferedReader.lines()                            创建一个有来自 BufferedReader 的行组成的流。
    BitSet.stream()                                    创建一个由 BitSet 中的设置位的索引组成的 IntStream。
    Stream.chars()                                    创建一个与 String 中的字符对应的 IntStream。
    

    中间流操作

    filter(Predicate<T>)                与预期匹配的流的元素
    map(Function<T, U>)                    将提供的函数应用于流的元素的结果
    flatMap(Function<T, Stream<U>>        将提供的流处理函数应用于流元素后获得的流元素
    distinct()                            已删除了重复的流元素
    sorted()                            按自然顺序排序的流元素
    Sorted(Comparator<T>)                按提供的比较符排序的流元素
    limit(long)                            截断至所提供长度的流元素
    skip(long)                            丢弃了前 N 个元素的流元素
    takeWhile(Predicate<T>)                (仅限 Java 9)在第一个提供的预期不是 true 的元素处阶段的流元素
    dropWhile(Predicate<T>)                (仅限 Java 9)丢弃了所提供的预期为 true 的初始元素分段的流元素
    

    终止流操作

    forEach(Consumer<T> action)            将提供的操作应用于流的每个元素。
    toArray()                            使用流的元素创建一个数组。
    reduce(...)                            将流的元素聚合为一个汇总值。
    collect(...)                        将流的元素聚合到一个汇总结果容器中。
    min(Comparator<T>)                    通过比较符返回流的最小元素。
    max(Comparator<T>)                    通过比较符返回流的最大元素。
    count()                                返回流的大小。
    {any,all,none}Match(Predicate<T>)    返回流的任何/所有元素是否与提供的预期相匹配。
    findFirst()                            返回流的第一个元素(如果有)。
    findAny()                            返回流的任何元素(如果有)。
    

    stream构造

    import java.util.Arrays;
    import java.util.List;
    import java.util.stream.Stream;
    
    class Rock{
        Rock(int i){
            System.out.println(i);
        }
    }
    
    public class HelloDate {
        public static void main(String[] args) {
            //stream 操作:构建
            //1. 单独的值
            Stream stream = Stream.of("a","b","c");
            //2. 数组
            String[] strings = new String[]{"a","b","c"};
            stream = Stream.of(strings);
            stream = Arrays.stream(strings);
            //3. collections
            List<String> list = Arrays.asList(strings);
            stream = list.stream();
        }
    }
    

    数值流的构造

    IntStream.of(new int[]{1,2,3}).forEach(i-> System.out.println(i));
    System.out.println(">>next");
    IntStream.range(1,3).forEach(i-> System.out.println(i));
    System.out.println(">>next");
    IntStream.rangeClosed(1,3).forEach(i-> System.out.println(i));
    

    映射

    List<Integer> nums = Arrays.asList(1,2,3,4);
    List<Integer> squareNums = nums.stream().map(n->n*n).collect(Collectors.toList());
    System.out.println(squareNums);
    

    输出为[1, 4, 9, 16]
    map 生成的是个 1:1映射,每个输入元素,都按照规则转换成为另外一个元素。还有一些场景,是一对多映射关系的,这时需要 flatMap。

    过滤

    Integer[] sixNums = {1,2,3,4,5,6};
    Integer[] evens = Stream.of(sixNums).filter(n->n%2==0).toArray(Integer[]::new);
    System.out.println(Arrays.asList(evens));
    

    输出为[2,4,6]

    例子 打印姓名(forEach 和 pre-java8 的对比)

    // Java 8
    roster.stream().filter(p -> p.getGender() == Person.Sex.MALE).forEach(p -> System.out.println(p.getName()));
    // Pre-Java 8
    for (Person p : roster) {
     if (p.getGender() == Person.Sex.MALE) {
     System.out.println(p.getName());
     }
    }
    

    peek 例子 对每个元素执行操作并返回一个新的 Stream

    System.out.println(Stream.of("one","two","three","four","five")
    .filter(p->p.length()>3)
    .peek(e-> System.out.println("Filtered value "+e))
    .map(String::toUpperCase)
    .peek(e-> System.out.println("Mapped value "+e))
    .collect(Collectors.toList()));
    

    parallelStream

    parallelStream其实就是一个并行执行的流.它通过默认的ForkJoinPool,可能提高你的多线程任务的速度.
    Stream具有平行处理能力,处理的过程会分而治之,也就是将一个大任务切分成多个小任务,这表示每个任务都是一个操作,因此像以下的程式片段:
    List numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
    numbers.parallelStream()
    .forEach(out::println);
    你得到的展示顺序不一定会是1、2、3、4、5、6、7、8、9,而可能是任意的顺序,就forEach()这个操作來讲,如果平行处理时,希望最后顺序是按照原来Stream的数据顺序,那可以调用forEachOrdered()。例如:
    List numbers = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9);
    numbers.parallelStream()
    .forEachOrdered(out::println);
    注意:如果forEachOrdered()中间有其他如filter()的中介操作,会试着平行化处理,然后最终forEachOrdered()会以原数据顺序处理,因此,使用forEachOrdered()这类的有序处理,可能会(或完全失去)失去平行化的一些优势,实际上中介操作亦有可能如此,例如sorted()方法。

    reduce

    这个方法的主要作用是把 Stream 元素组合起来。 它提供一个 起始值(种子),然后依照运算规则(BinaryOperator),和前面 Stream 的第一个、第二个、第 n 个元素组合。 从这个意义上说,字符串拼接、数值的sum、min、max、average 都是特殊的 reduce。例如 Stream 的 sum 就相当于

    Integer sum = integers.reduce(0, (a, b) -> a+b);
    

    Integer sum = integers.reduce(0, Integer::sum);
    

    最小值、拼接、求和

    Integer sum = Stream.of(sixNums).reduce(0,(a,b)->a+b);
    String concat = Stream.of("A","B","c","D").reduce("",String::concat);
    double minValue = Stream.of(1.0,2.1,-0.3).reduce(Double.MAX_VALUE,Double::min);
    concat = Stream.of("A","B","c","D").filter(x->x.toLowerCase().compareTo("c")>0).reduce("",String::concat);
    

    limit/skip

    limit 返回 Stream 的前面 n 个元素;skip 则是扔掉前 n 个元素(它是由一个叫 subStream 的方法改名而来)。

    部分测试代码

    import java.util.Arrays;
    import java.util.List;
    import java.util.stream.Collectors;
    import java.util.stream.Stream;
    
    public class HelloDate {
    
        public static void main(String[] args) {
            //stream 操作:构建
            //1. 单独的值
    
            Stream<String> stream = Stream.of("a","b", "c");
            //转为数组
            String[] strArray1 = stream.toArray(String[]::new);
    
    
            stream = Stream.of("a","b", "c");
            List<String> list1 = stream.collect(Collectors.toList());
            System.out.println(list1);
    
    
            List<Integer> nums = Arrays.asList(1,2,3,4);
            List<Integer> squareNums = nums.stream().map(n->n*n).collect(Collectors.toList());
            System.out.println(squareNums);
    
            Integer[] sixNums = {1,2,3,4,5,6};
            Integer[] evens = Stream.of(sixNums).filter(n->n%2==0).toArray(Integer[]::new);
            System.out.println(Arrays.asList(evens));
    
            System.out.println(Stream.of("one","two","three","four","five").filter(p->p.length()>3).peek(
                    e-> System.out.println("Filtered value "+e)
            ).map(String::toUpperCase).peek(e-> System.out.println("Mapped value "+e)).collect(Collectors.toList()));
    
            Integer sum = Stream.of(sixNums).reduce(0,(a,b)->a+b);
            System.out.println(sum);
    
            String concat = Stream.of("A","B","c","D").reduce("",String::concat);
            double minValue = Stream.of(1.0,2.1,-0.3).reduce(Double.MAX_VALUE,Double::min);
            concat = Stream.of("A","B","c","D").filter(x->x.toLowerCase().compareTo("c")>0).reduce("",String::concat);
            System.out.println(concat);
        }
    }
    

    如化平方数

    import java.util.stream.Collectors;
    
    public class SquareDigit {
    
        public int squareDigits(int n) {
            return Integer.parseInt(String.valueOf(n)
                                          .chars()
                                          .map(i -> Integer.parseInt(String.valueOf((char) i)))
                                          .map(i -> i * i)
                                          .mapToObj(String::valueOf)
                                          .collect(Collectors.joining("")));
        }
    
    }
    

    部分测试代码

    import java.util.Arrays;
    import java.util.List;
    import java.util.stream.Collectors;
    import java.util.stream.IntStream;
    import java.util.stream.Stream;
    
    public class HelloDate {
        public static int[] HelloDate(int[] arr) {
            int[] newArr = IntStream.of(arr).map(x->x*2).toArray();
            return newArr;
        }
    
        public static void main(String[] args) {
            int a = 1246;
            String b = "woc";
            String c = "123";
            System.out.println(String.valueOf(a).chars().map(i->Integer.parseInt(String.valueOf((char)i)))
                                .map(i->i*i)
                                .mapToObj(String::valueOf)
                                .collect(Collectors.joining(""))
            );
            String d = "1";
            System.out.println(Integer.parseInt(String.valueOf(d)));
    
            System.out.println("直接输出char");
            String.valueOf(a)
                    .chars()
                    .forEach(i-> System.out.println(i));
    
            System.out.println("转化为int之后再输出");
            int res = Integer.parseInt(String.valueOf(a)
                    .chars()
                    .map(i->Integer.parseInt(String.valueOf((char)i)))
                    .mapToObj(String::valueOf)
                    .collect(Collectors.joining(""))
            );
    
            char i = '1';
            System.out.println(Integer.parseInt(String.valueOf(i)));
    
            System.out.println(res);
            int n = 120;
            if(n<0) System.out.println("false");
            int n_sqrt = (int)Math.round(Math.sqrt(n));
            System.out.println(n_sqrt*n_sqrt==n);
    
            String pin = "a123";
            String pin2 = "a1 23 dfas";
            int[] aaa = new int[]{1,5,2,6,7,3,6};
    
            //Integer[] aaa2 = IntStream.of(aaa).filter(nn->nn%2!=0).toArray();
            //System.out.println(list);
            System.out.println(IntStream.of(aaa)
                    .map(li->li*li)
                    .sum()
            );
            System.out.println(new StringBuilder(pin).reverse().toString());
            String[] l = String.valueOf(pin2).split(" ");
            System.out.println();
            String afterJoining = Stream.of(l)
                    .map(i2->new StringBuilder(i2).reverse().toString())
                    .collect(Collectors.joining(" "))
            ;
            System.out.println(afterJoining);
    
            String[] afterSplit = String.valueOf("123").split(" ");
            Stream.of(afterSplit)
                    .map(iiii->new StringBuilder(iiii).reverse().toString())
                    .collect(Collectors.joining(" "));
    
            String[] L = new String[]{"ABART 20", "CDXEF 50", "BKWRK 25", "BTSQZ 89", "DRTYM 60"};
            String[] M = new String[]{"A", "B", "C", "W"};
            int[] mSum = new int[M.length];
            for(String ii:L){
                StringBuilder stringBuilder = new StringBuilder(ii);
                for (int i)
            }
        }
    }
  • 相关阅读:
    idea 快捷键
    vue.js
    破解idea
    如何进行反向迭代以及如何实现反向迭代?
    如何使用生成器函数实现可迭代对象?
    从一个实际小例子来看python中迭代器的应用
    MySql中常用的内置函数
    linux服务器重启oracle服务。
    oracle里面清除服务器上所有的oracle服务。
    刷机后的环境变量
  • 原文地址:https://www.cnblogs.com/hqinglau/p/12191689.html
Copyright © 2011-2022 走看看