Java 1.8 学习笔记

java中重要的函数接口

接口 参数 返回类型 示例
Predicate< T > T boolean 这张唱片已经发行了吗
Consumer< T > T void 输出一个值
Function< T,R > T R 获得Artist对象的名字
Supplier< T > None T 工厂方法
UnaryOperator< T > T T 逻辑非
BinaryOperator< T > (T,T) T 求两个数的乘积

stream 中的 filter 方法和 count 方法

filter 方法并未做什么实际性的工作,只刻画出了stream,但没有产生新的集合,这类方法叫惰性求值
count 方法最终会从 stream 产生值,这类方法叫及早求值方法

Stream.of()和*.stream()的区别

Stream.of(T t...)中t是流的多个元素,.stream()是把集合的每个元素变成流

Stream<List<Track>> stream = Stream.of(tracks);  
Stream<Track> stream2 = tracks.stream();
  • map
    元素处理,一一映射

    List<Integer> collect1 = allInt.stream().filter(ele -> ele > 5)
    .map(ele -> ele * 10).collect(Collectors.toList());
    System.out.println(collect1);

  • filter
    过滤元素
  • flatMap
    可以把多个流合并成一个流
    返回值是stream
List<Integer> collect = Stream.of(list1, list2).flatMap(ele -> ele.stream())  
                        .collect(Collectors.toList());  
System.out.println(collect);  
  • min() & max()
    比较
List<Track> tracks = Arrays.asList(new Track("imagine", 92),new Track
                ("super star", 28), new Track("halo", 64));
Track track1 = tracks.stream().min(Comparator.comparing(track -> 
                track.getName().length())).get();  
  • reduce
    循环计算
    reduce(初始值, BinaryOperator<T>(传递的循环计算结果, 遍历的流中的值))
Integer reduce = Stream.of(1, 2, 3).reduce(10, (acc, element) -> acc - element);  

拆装箱

int => Integer : intFunction
Integer => int : toIntFunction
高阶函数使用基本类型:mapToInt()——方法 + to + 基本类型
mapToInt 返回的不是一个一般的 stream,这个 stream 的 map() 等方法都用的不是原来的接口。
该特殊 stream 有个 summaryStatistics() 方法得到的对象中有诸多计算属性,方便计算。

IntSummaryStatistics iss = album.getTracks().stream()
            .mapToInt(trac -> trac.getLength())
            .map(length -> length + 1)
            .summaryStatistics();
System.out.println(iss);

// 输出
IntSummaryStatistics{count=1, sum=11, min=11, average=11.000000, max=11}

重载

会优先使用最具体的类型的函数
错误: Ambiguous method call .Both
重载函数模糊调用,参数列表都匹配。

  • 只有一个可能的目标类型:由相应函数接口里的参数类型推导得出;
  • 多个可能的目标类型:由最具体的参数类型推导得出;
  • 多个可能的目标且具体类型不明:需人为指定类型,否则编译报错。

默认方法

接口(无论函数还是非函数)告诉它的所有子类:如果你没有实现这个方法,就使用我的吧。
子类重写方法覆盖默认方法。
如果一个类实现了两个含有相同签名函数的接口,编译报错。解决方法:实现类实现该函数。

  • 类胜于接口
  • 子类胜于父类
    接口:允许多重继承,没有成员变量;
    抽象类:不能多重继承,可继承成员变量。

Optional

String s = null;
Optional<String> optional = Optional.ofNullable(s);
s = "aa";

在上面这段代码中,最后一行赋值并没有任何作用:Optional对象直接被赋予了String的值,而非String对象

Optional对空值更简单的处理:

Optional<String> op = Optional.ofNullable(str);
String result = op.orElseGet(() -> "");

相当于:

String result = str==null ? "" : str;

orElse 和 orElseGet 的区别

optional.orElse("unknow");
optional.orElseGet(() -> "unknow");

流的顺序

原集合有序,则出去的流依然有序;原集合无序,则出去的流也无序。
一些操作在有序的流上开销更大,可调用unordered方法消除顺序;大多数操作(filter map reduce)在有序流上效率更高。

Collect

stream类库在collect的时候自动挑选合适的集合类型。
如果需要指定类型,则可以:

stream.collect(Collectors.toCollection(TreeSet::new));

转换成值

// 找出成员最多的乐队
Function<Artist, Long> getCount = artist -> artist.getMembers.count();
Optional<Artist> maxArtist = artists.stream().
                        collect(Collectors.maxBy(
                        Comparator.comparing(getCount)));

// 一组乐队的成员平均数
Double averageMember = artists.stream().collect(
                Collectors.averagingInt(
                artist -> artist.getMembers().size()));

partitioningBy收集器

// 区分乐队和单个歌手
Map<Boolean,List<Artist>> map = 
            stream.collect(Collectors.partitioningBy
            (artist -> artist.isSolo()));
// 另一种写法:使用方法
Map<Boolean, List<Artist>> map = stream.collect(
            Collectors.partitioningBy(Artist:: isSolo));

拼接字符串

把流中的元素按照规律拼接成字符串。
joining(元素中分隔字符,开始字符,结束字符)

String collect = f4.getMembers().stream()
            .map(Artist:: getName)
            .collect(Collectors.joining(",","[","]"));

组合收集器

把流中的元素按照规则分组,并与想收集的值关联。
groupingBy(分组的方式Function, 收集的数据Collector)

// 计算每个艺术家的专辑数
Map<Artist, Long> map = albums.stream().collect(
            Collectors.groupingBy(Album:: getMainArtist, Collectors.counting()));

// 每个艺术家的专辑名
Map<Artist, List<String>> map = albums.stream().collect(
            Collectors.groupingBy(Album:: getMainArtist, 
            Collectors.mapping(Album:: getName, Collectors.toList())));
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,198评论 4 359
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,663评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,985评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,673评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,994评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,399评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,717评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,407评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,112评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,371评论 2 241
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,891评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,255评论 2 250
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,881评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,010评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,764评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,412评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,299评论 2 260

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,087评论 18 139
  • 第一章 为什么要关心Java 8 使用Stream库来选择最佳低级执行机制可以避免使用Synchronized(同...
    谢随安阅读 1,440评论 0 4
  • Java8 in action 没有共享的可变数据,将方法和函数即代码传递给其他方法的能力就是我们平常所说的函数式...
    铁牛很铁阅读 1,143评论 1 2
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,292评论 18 399
  • 关于 本文是对 Brian Goetz的State of the Lambda: Libraries Editio...
    aaron688阅读 1,296评论 0 5