文档章节

java8之Stream API(filter,map和flatMap方法)

柳哥
 柳哥
发布于 2015/09/07 23:17
字数 564
阅读 4981
收藏 0

流转换是指从一个流中读取数据,并将转换后的数据写入到另一个流中。前面介绍过过滤器转换,它会产生一个新的流,其中包含符合某个特定条件的所有元素:

List<String> wordList = ......;
Stream<String> words = wordList.stream();
Stream<String> longWords = words.filter(w -> w.length() > 12);

filter方法的参数是一个Predicate<T>对象——即一个从T到boolean的函数。

我们经常需要对一个流中的值进行某种形式的转换。这时可以考虑使用map方法,并传递给它一个执行转换的函数。例如:

package java8test;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class T1 {
    public static void main(String[] args) {
        List<String> wordList = Arrays.asList("abc","mdw","ket");
        Stream<String> words = wordList.stream();
        //注意下面这一句
        Stream<String> lowercaseWords = words.map(String::toUpperCase);
        lowercaseWords.forEach(System.out::println);
    }
}

在上例中,我们使用了带有一个方法引用的map方法。通常,你会使用一个lambda表达式来代替方法表达式:

Stream<Character> firstChars = words.map(s -> s.charAt(0));

该方法产生的流会包含每个单词的第一个字符。

当你使用map方法时,会对每个元素应用一个函数,并将返回的值收集到一个新的流中。现在,假设你有一个函数,它返回的不是一个值,而是一个包含多个值的流,如下所示:

package java8test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class T1 {
    public static void main(String[] args) {
        List<String> wordList = Arrays.asList("abc","mdw","ket");
        Stream<String> words = wordList.stream();
        //注意下面两句
        Stream<Stream<Character>> lowercaseWords = words.map(T1::characterStream);
        lowercaseWords.forEach(stream -> stream.forEach(System.out::println));
    }
    public static Stream<Character> characterStream(String s) {
        List<Character> result = new ArrayList<>();
        //Stream<T>,T必须是类类型,基本类型不可以
        for(char c:s.toCharArray()) result.add(Character.valueOf(c));
        return result.stream();
    }
}

上例,如果我们使用常用的map()方法获取的lowercaseWords数据结构为:[['a','b','c'],['m','d','w'],['k','e','t']]。如果我们要得到如:['a','b','c','m','d','w','k','e','t']这样数据结构的数据,就需要使用flatMap()方法。示例:

package java8test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class T1 {
    public static void main(String[] args) {
        List<String> wordList = Arrays.asList("abc","mdw","ket");
        Stream<String> words = wordList.stream();
        //再次注意下面两句
        Stream<Character> lowercaseWords = words.flatMap(T1::characterStream);
        lowercaseWords.forEach(System.out::println);
    }
    public static Stream<Character> characterStream(String s) {
        List<Character> result = new ArrayList<>();
        for(char c:s.toCharArray()) result.add(Character.valueOf(c));
        return result.stream();
    }
}


© 著作权归作者所有

柳哥
粉丝 207
博文 405
码字总数 347782
作品 0
杭州
技术主管
私信 提问
java8 -函数式编程之Stream

在 java8 -函数式编程之Lambda表达式、 java8 -函数式编程之四个基本接口 、java8 -函数式编程之Optional 三篇文章中,我们已经对函数式编程有了充分的了解,接下来,我们将会运用之前学到的...

细肉云吞
2018/12/24
496
1
java8之Lambda知识回顾

前提 18年第一篇文章,祝各位新年快乐哈~ 介绍Lambda之前,可以看下我们定义View点击事件的一般做法 这种回调模式在日常开发中很常见,但是随之也暴露了一些不良的弊端 1、非抽象化,整个代码...

DevSiven
2018/01/05
0
0
Java8 - Stream API

Java8 - Stream API 1.介绍 Stream创建 -> 中间操作 -> 终止操作 流一旦使用终止操作,就不能再进行中间操作 Java8 特性 与 函数式接口 配合使用 参考Java8 - Lambda表达式 与 Optional 配合...

晨猫
02/10
61
1
Java8 - 使用Stream API

Java8 - 使用Stream API Stream 是什么? Stream represents a sequence of objects from a source, which supports aggregate operations(多种操作). Following are the characteristics......

秋风醉了
2018/09/12
61
0
java8 -函数式编程之Optional

前言 在某些情况下,首先要判断某个参数或者某个方法的返回值是否为null,才能继续操作该参数。对于某些链式操作需要多次通过if语句判断是否为空,才能确保不抛出NullPointerException,这段...

细肉云吞
2018/12/24
219
0

没有更多内容

加载失败,请刷新页面

加载更多

华为手机翻译功能怎么使用?这三种方法请务必收藏

华为手机翻译功能怎么使用?在我们的生活中会经常遇到翻译问题,许多外语不好的朋友该怎么办呢?华为手机已经为我们解决了这个问题,今天小编就教大家学会使用华为手机中的三种翻译技巧,需要...

翻译小天才
16分钟前
2
0
企业服务软件开发中需要注意的三个问题

在开发企业服务软件时,我们需要分为:业务需求、用户需求、产品需求,三大需求层次,三个层次互相关联,企业服务软件开发首先要服务业务,需要满足业务的需求,再关注用户体验,也就是用户需...

积木创意科技
19分钟前
2
0
C++容器底层数据结构

内置数组: int arr[10][10];memset(arr,0,10*10*sizeof(int)); //初始化int tmp[10][10];memcpy(arr, tmp, 10 * 10 * sizeof(int));//拷贝 void *memcpy(void *destin, void *source,......

SibylY
20分钟前
2
0
Dubbo-自适应拓展机制

背景 在 Dubbo 中,很多拓展都是通过 SPI 机制进行加载的,比如 Protocol、Cluster、LoadBalance 等,这些都是Dubbo的基础组件。这些基础组件的拓展不是在系统框架启动阶段被加载,而是拓展方...

rock-man
48分钟前
7
0
Kali安装fcitx输入法(五笔)

安装fcitx > sudo apt-get install fcitx-rime fcitx-config-gtk3 重启 > sudo reboot fcitx配置 效果就是这样 配置输入法切换 系统设置...

yeahlife
50分钟前
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部