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)
        }
    }
}
posted @ 2020-01-14 14:05  13th  阅读(544)  评论(0编辑  收藏  举报