JDK8中Stream及Optional学习笔记

Stream流

普通循环写法,迭代在外部进行
流式写法,迭代由内部控制,内部迭代将更多控制权交给了集合类

Stream的使用非常类似建造者模式

Stream中的方法通常分为以下两种:

  1. 惰性求值:不会进行方法执行,其特征:返回值为stream

  2. 及早求值:会触发方法执行

Stream的常用方法

  • forEach: 迭代
  • map:用新的值替代Stream中的旧值,mapToInt则可以将Stream转化为IntStream
  • flatMap: 把一个流中的每个值都换成另一个流,然后把所有的流连接
    起来成为一个流(将流扁平化)
  • filter:过滤部分Stream中的值
  • distinct: 去除重复元素
  • limit:截取流中指定个数元素
  • skip: 跳过流中指定个数的元素,和limit起到互补作用
  • allMatch/anyMatch/noneMatch: 全部匹配/任意一个匹配/没有匹配,返回boolean
  • findAny/findFirst: 返回任意一个元素/返回第一个元素,返回类型为Optional
  • min&max: 求最大最小值
  • count: 计算个数
  • reduce: 递归操作
  • peek:用于记录日志或查看每一个值

高阶函数:如果函数的参数列表里包含函数接口,或该函数返回一个函数接口,那么该函数就是高阶函数,例如map方法

数值流

数值流包含IntStreamLongStreamDoubleStream,它们避免了隐形的拆箱成本,并且实现了一些独有的数值计算方法,如maxmin/maxaveragerange/rangedsummaryStatistics等,需要转换回对象流可以使用boxed方法,或者mapToObj方法

创建流的方式

  1. 由值创建:
Stream<String> stream = Stream.of("Java 8 ", "Lambdas ", "In ", "Action");
  1. 由数组创建:
int[] numbers = {2, 3, 5, 7, 11, 13}; int sum = Arrays.stream(numbers).sum();
  1. 由文件创建:
Stream<String> lines =
Files.lines(Paths.get("data.txt"), Charset.defaultCharset());
  1. 由函数创建:
Stream.iterate(0, n -> n + 2).limit(10).forEach(System.out::println);

Stream.generate(Math::random).limit(5).forEach(System.out::println);

Optional

Optional<T>是一个容器类,代表一个值存在或不存在,使用Optional<T>定义属性的类型可以清楚说明属性是否支持为null

创建Optional对象
  1. 声明一个空的Optional
Optional<Car> optCar = Optional.empty();
  1. 依据一个非空值创建Optional
Optional<Car> optCar = Optional.of(car);
  1. 可接受null的Optional
Optional<Car> optCar = Optional.ofNullable(car);
Optional无法序列化

Optional<T>类型的属性无法序列化,实在需要用到的情况可以采用以下方式

public class Person {
    private Car car;
    public Optional<Car> getCarAsOptional() {
        return Optional.ofNullable(car);
    }
}
Optional的常用方法
  • map/flatMap/filter:与Stream中用法类似
  • get():值存在时返回值,否则抛出一个NoSuchElement异常
  • isPresent():有值则返回true
  • ifPresent(Consumer<T> block):会在值存在的时候执行给定的代码块
  • orElse(T other):值存在时返回值,否则返回一个默认值
  • orElseGet(Supplier<? extends T> other):orElse方法的延迟调用版,Supplier
    方法只有在Optional对象不含值时才执行调用
  • orElseThrow(Supplier<? extends X> exceptionSupplier):与get()类似,不同的是可以自定义异常类型

收集器工具类Collectors

可在Streamcollect方法中使用

  • toCollection 转换成其他集合
  • maxBy/minBy/averagingInt/summingInt 转换成值
  • partitioningBy 数据二分
  • groupingBy 数据分多组
  • joining 字符串拼接(可支持自定义分隔符、前缀和后缀)
    注:menu.stream().map(Dish::getName).collect(joining());中当Dish对象实现了toString方法时,可以直接简写为menu.stream().collect(joining());
  • mapping 转换集合类型

并行化流

  • parallel: 将流并行化
  • sequential: 将流串行化

并行流底层使用了fork/join框架,因此能重复将数据结构对半分解的难易程度,决定了分解操作的快慢,如支持随机读取的数组并行化处理的性能最好,其次是TreeSetHashSet这样不易公平分解的数据类型,最差的是LinkedList这样长度未知的数据类型。

并行化数组操作

可以通过工具类Arrays进行,其主要方法有

  • copyOf 复制数组
  • parallelSetAll 使用Lambda表达式更新数组元素
  • parallelPrefix 任意给定一个函数,逐个将当前元素和之前的累计值进行函数操作
  • parallelSort 并行化对数组元素进行排序
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,110评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,443评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,474评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,881评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,902评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,698评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,418评论 3 419
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,332评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,796评论 1 316
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,968评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,110评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,792评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,455评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,003评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,130评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,348评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,047评论 2 355

推荐阅读更多精彩内容