案例:对给定单词列表 ["Hello","World"],你想返回列表["H","e","l","o","W","r","d"]

使用map方式

@Test
    public void jdk8StreamMap() {
        List<String> words = new ArrayList<String>();
        words.add("hello");
        words.add("word");
        //
        words.stream()
                //<R> Stream<R> map(Function<? super T, ? extends R> mapper)
                .map(word -> {
                    //这里将接收到的字符串hello转换成['h','e','l','l','o']并返回,对word字符串也是如此
                    String[] retArray = word.split("");
                    //map返回的是String[]类型的
                    return retArray;
                })
                //经过map之后,得到的是Stream<String[]>
                .forEach(e -> {
                    System.out.println(e);
                });

    }

  代码输出为:[Ljava.lang.String;@12edcd21[Ljava.lang.String;@34c45dca 

        这个实现方式是由问题的,传递给map方法的lambda为每个单词生成了一个String[](String列表)。因此,map返回的流实际上是Stream<String[]> 类型的。

        但是我们真正想要的是用Stream<String>来表示一个字符串。

使用flatMap方式(flat,flattern单词的意思就是折叠,压扁,扁平化)

在python中也有类似的函数flatten(),功能是将二维数组降维为一个以为数组,功能都类似

这里flatMap方法的功能注释:

flatMap()方法的作用是对一个stream流的元素进行一对多的转换,然后将结果折叠到一个新的stream中。

一定要记住的是,flatMap会将多个stream合并到一个新流里,这个是重要特点

    @Test
    public void jdk8StreamFlatMap() {
        List<String> words = new ArrayList<String>();
        words.add("hello");
        words.add("word");

        words.stream()
                //The {@code flatMap()} operation has the effect of applying a one-to-many transformation to the elements of the stream, and then flattening the resulting elements into a new stream.
                //<R> Stream<R> flatMap(Function<? super T, ? extends Stream<? extends R>> mapper)
                .flatMap(word -> {
                    //这里将接收的字符串hello转换成['h','e','l','l','o']数组,然后又转换成一个stream对象(对word也是如此),然后将这些stream合并成一个stream
                    //System.out.println("log->" + word);
                    return Arrays.stream(word.split(""));
                })
                //经过flatMap之后,得到的是Stream<String>
                .distinct()
                .collect(Collectors.toList())
                .forEach(e -> {
                    System.out.println(e);
                });
    }

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐