技术总结 | Java 8 新特性 Lambda表达式及流使用总结

Lambda 表达式

  1. Lambda 表达式语法

Lambda 表达式语法包含三个部分:

  • 参数列表:函数的入参。
  • 箭头:把参数列表和 Lambda 主体分开。
  • Lambda 主体:函数主要实现的功能
(String s1,String s2) -> s1.length().compareTo(s2.length());

其中,(String s1,String s2)为参数列表,s1.length().compareTo(s2.length());为Lambda主体。

Lambda 表达式的基本语法:

(parameters) -> expression
// 或者(请注意花括号)
(parameters) -> {statements;}
  1. Lambdas及函数式接口的例子
使用案例 Lambdas例子 对应的函数式接口
boolean 表达式 List<String> list -> list.isEmpty() Predicate<List<String>>
创建对象 () -> new Apple(10) Supplier<Apple>
消费对象 (Apple a) -> System.out.println(a.getWeight()) Consumer<Apple>
从一个对象中提取 (String s) -> s.length() Function<String,Integer>或<ToIntFunction<String>
  1. 方法引用
    Lambda 及其等效方法方法引用示例
Lambda 等效引用方法
(Apple a) -> a.getWeight() Apple::getWeight
() -> Thread.currentThread().dumpStack Thread.currentThread::dumpStack
(String s) -> System.out.println(s) System.out::println

Java8 引入流

  1. 流是什么

流是Java API的新成员,它允许你以声明的方式处理数据集合。可以把它们看作是遍历数据集的高级迭代器。

流使用样例:

List<String> names = menu.stream()
                         .filter(d -> d.getCalories() > 300)
                         .map(Dish::getName)
                         .limit(3)
                         .collect(toList());

该表达式的含义:过滤卡路里大于 300 的三盘菜

  1. 如何使用流
    流的使用一般包含三件事
  • 一个数据源。
  • 中间操作,形成一个流的流水线
  • 一个终端,生成结果。
  1. 流的中间操作
操作 类型 返回类型 操作函数 函数描述符
filter 中间 Stream<T> Predicate<T> T -> boolean
map 中间 Stram<T> Function<T,R> T -> R
limit 中间 Stream<T>
sort 中间 Steam<T> Comparator<T> (T,T) -> int
distinct 中间 Steam<T>
  1. 流的终端操作
操作 类型 目的
forEach 终端 消费流中的每一个元素并对其应用 Lambda,该操作返回 void
count 终端 返回流中的个数,该操作返回 long
collect 终端 把流归约成一个集合,如 List、Map甚至是 Integer
  1. map使用

返回集合中每个字段的长度:

List<String> words = Arrays.asList("Hello","Word","Java 8","Lambdas","Actions");
List<Integer> wordLengths = words.stream().map(String::length).collect(Collectors.toList());
  1. 匹配
    数据是否匹配条件
// 是否都匹配
boolean isHealthy =  menu.stream().allMatch(d -> d.getCalories <1000);
// 确保没有匹配
boolean isHealthy = menu.stream().noneMatch(d -> d.getCalories>=1000);
  1. 计数
long count = list.stream().filter(s -> s.equals("A")).count();
  1. 取交集
List<String> updateData = param.stram().filter(all::contains).collect(Collectors.toList());

其中,all:["aaa","bbb", "ccc", "ddd", "eee"] ,param:["aaa", "ccc", "fff"]

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

推荐阅读更多精彩内容