内容根据bilibili @字母哥课堂  课程进行整理;字母哥博客

一、Lambda表达式

lambda表达式就好像f(x)表达函数一样,基本格式就是:

(参数1,参数2,...) -> {操作表达式1;操作表达式2;...};

一番操作之后会返回一个对象,这个对象类型编译器会依靠联系上下文得知。

注:如果参数只有一个的时候小括号可以省略

如果操作语句只有一个的时候,大括号也可以省略。

例子:如果我们定义一个API,然后用的时候再实现。

//定义API
interface Printer{void printerIt(String val);}//使用API的方法public void printerString(String str,Printer printer){printer.printIt(str);}

传统实现方式:

Printer  printer = new Printer() {@Overridepublic void printIt(String val) {System.out.println(val);}};this.printerString(str,printer);

lambda实现:

this.printerString(str, val-> System.out.println(val));

二、Stream代替for循环

例子:在部分NBA球员名单中挑出C开头的,转换为大写并排序

//创建一个List集合List<String> players = Arrays.asList("Kobe","james","curry","chris","carmelo");List<String> sorted =  players.stream()                //转换成流进行操作.filter(s -> s.startsWith("c"))    //筛选出C开头的名字,内嵌的lambda,s是List对象.map(String ::toUpperCase)        //对每一个数据进行大写转换.sorted()                          //排序,括号里可以添加排序规则.collect(Collectors.toList());     //返回List对象进行接收System.out.println(sorted);

其他对象转换为流的方式

// 数组转换成流String[] players ={"Kobe","james","curry","chris","carmelo"};Stream.of(players).filter().map();            //这一行没有些完整,但是他视频里就是这么写的//哈希set转换成流List<String> players =Arrays.asList("Kobe","james","curry","chris","carmelo");Set<String> set=  new HashSet<>(players);List<String> sorted =  set.stream().filter(s -> s.startsWith("c")).map(String ::toUpperCase).sorted().collect(Collectors.toList());//文件转换成流try {Stream<String> stringStream = Files.lines( Paths.get("file.txt"));} catch (IOException e) {e.printStackTrace();}

三、Stream的filter函数与谓词逻辑

先创建一个Employee类

package com.bytedance.demo;import lombok.AllArgsConstructor;
import lombok.Data;@Data
@AllArgsConstructor
public class Employee {private Integer id;private Integer age;private String gender;private String firstName;private String lastName;}

@Data:自动生成getter、setter和toString方法

@AllArgsConstructor:全参构造函数

在编译器生效。

lombok插件安装:File ->settings ->Plugins ->搜索lombok,并在xml中添加依赖

<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency>

然后在另外一个类添加实际数据并测试上一部分学的东西。

public static void main(String[] args){Employee e1 = new Employee(1,23,"M","Rick","Beethovan");Employee e2 = new Employee(2,13,"F","Martina","James");Employee e3 = new Employee(3,43,"M","Ricky","Marx");Employee e4 = new Employee(4,26,"M","Jon","Armstrong");Employee e5 = new Employee(5,19,"F","Cristine","Roy");Employee e6 = new Employee(6,35,"M","David","Feezor");Employee e7 = new Employee(7,68,"F","green","Gussin");Employee e8 = new Employee(8,79,"M","Alec","Singh");Employee e9 = new Employee(9,15,"F","olive","Jain");Employee e10 = new Employee(10,45,"M","watson","Lowman");List<Employee> employeeList = Arrays.asList(e1,e2,e3,e4,e5,e6,e7,e8,e9,e10);List<Employee>employees =  employeeList.stream().filter(e->e.getAge()>70&&e.getGender().equals("M")).collect(Collectors.toList());System.out.println(employees);}

Stream.filter()中的Predicate谓语接口

Stream< T> filter (Predicate<? super T> predicate);

谓词逻辑:例如sql语言里的where,进行限定主语的语句就是谓词逻辑;即lambda表达式表达的就是一个谓词逻辑。

//定义谓词逻辑public static Predicate<Employee> ageGreaterThan70 = x->x.getAge()>70;public static Predicate<Employee> genderM = e->e.getGender().equals("M");

使用谓词完成刚才的语句

List<Employee>employees = employeeList.stream().filter(Employee.ageGreaterThan70.and(Employee.genderM)).collect(Collectors.toList());//对谓词或运算取反
Employee.ageGreaterThan70.or(Employee.genderM).negate()

总结,谓词可以方便代码复用,但并不常用,看个人喜好

四、stream的map数据转换

map可以根据lambda表达式对数据进行映射或数据类型转换,之前有用过map(String::toUpperCase)

map()括号里本质上是去写一个完整的函数,进行数据的转换。

map(s ->{      函数体;    return;    })

这个机构当然可以简写,如果只有一步的话不需要进行return操作了,直接map(s->s.toUpperCase())之类的操作就可以。也可以写成map(String::toUpperCase)

map也可以进行类转换,比如:

List<GoodsCombineItemListVO> dtoList = goodsItemDao.queryByPage(queryPO).stream().map(combineItem->{GoodsCombineItemListVO dto = new GoodsCombineItemListVO();BeanUtils.copyProperties(combineItem,dto);return dto;}).collect(Collectors.toList());

map()函数不仅可以处理数据,还可以转换数据的类型。如下:

List<Integer> lengths = alpha.stream().map(String::length).collect(Collectors.toList());System.out.println(lengths); //[6, 4, 7, 5]
Stream.of("Monkey", "Lion", "Giraffe", "Lemur").mapToInt(String::length).forEach(System.out::println);

如果类型不进行转换的话,仅仅是数据的加工,可以把map替换成peek,并且不需要进行return。

FlatMap的使用

用途:在多维数组嵌套时使用

map可以对管道流中的数据进行转换操作,但是如果管道中还有管道该如何处理?即:如何处理二维数组及二维集合类。实现一个简单的需求:将“hello”,“world”两个字符串组成的集合,元素的每一个字母打印出来。如果不用Stream我们怎么写?写2层for循环,第一层遍历字符串,并且将字符串拆分成char数组,第二层for循环遍历char数组。

List<String> words = Arrays.asList("hello", "word");
words.stream().map(w -> Arrays.stream(w.split("")))    //[[h,e,l,l,o],[w,o,r,l,d]].forEach(System.out::println);

输出打印结果:

java.util.stream.ReferencePipeline$Head@3551a94
java.util.stream.ReferencePipeline$Head@531be3c5
  • 用map方法是做不到的,这个需求用map方法无法实现。map只能针对一维数组进行操作,数组里面还有数组,管道里面还有管道,它是处理不了每一个元素的。

  • flatMap可以理解为将若干个子管道中的数据全都,平面展开到父管道中进行处理。

words.stream().flatMap(w -> Arrays.stream(w.split(""))) // [h,e,l,l,o,w,o,r,l,d].forEach(System.out::println);

输出打印结果:

h
e
l
l
o
w
o
r
d

Lambda使用指北(上)相关推荐

  1. 新司机的黑裙战斗机 篇二:入门—新司机的黑群晖指北——软件篇(上)

    原文网址:https://post.smzdm.com/p/alpkmoge/ 各位剁友好,我是身在长沙的一只小剁,因为ID的缘故长沙剁友赐雅号--姐夫 上一篇关于硬件配置和装机的晒单,引发了大量评论 ...

  2. 10《区块链财富指北》DAPP篇(2):从钱包上调用合约发行通证(Token)。

    DAPP(2):从钱包上调用合约发行通证(Token). <区块链财富指北>系列文章由NOCY.COM策划,肖南飞主笔撰写. 技术选型基于BOScore公链,旨在以有趣易懂的方式传播普及区 ...

  3. 观点|词云指北(上):谈谈词云算法的发展

    本文通过调研学术.商业.开源三个领域词云相关的产品,对词云相关算法.产品进行从上至下的总结,帮助读者快速了解词云相关的算法发展,并希望总结出当前字节跳动数据平台词云发展的路线. 全文将分两次推送,第一 ...

  4. Python 简单入门指北(二)

    Python 简单入门指北(二) 2 函数 2.1 函数是一等公民 一等公民指的是 Python 的函数能够动态创建,能赋值给别的变量,能作为参传给函数,也能作为函数的返回值.总而言之,函数和普通变量 ...

  5. es6 filter函数的用法_Python 函数式编程指北,不只是面向对象哦!超级详细!

    Python 函数式编程指北, 不只是面向对象哦 了解在Python中如何使用 lambda, map, filter 和 reduce 函数来转换数据结构 Photo by Markus Spisk ...

  6. Python 简单入门指北(试读版)

    本文是我小专栏中 Python 简单入门指北 一文的前半部分,如果你能坚持读完并且觉得有一定收获,建议阅读原文,只需一杯咖啡钱就可以阅读更精彩的部分,也可以订阅小专栏或者加入我的知识星球,价格都是 6 ...

  7. Laravel 集成 JPush 极光推送指北

    2019独角兽企业重金招聘Python工程师标准>>> 我是一个 Laravel 小白,我是一个 Laravel 小白,我是一个 Laravel 小白(默念三遍再往下读,如果非小白就 ...

  8. 怎么用class引入svg_【蓝湖指北】走向设计巅峰,从蓝湖 Sketch 插件开始,用它!...

    用好蓝湖,提升团队协作效率,蓝湖指北,教你如何用好蓝湖.本期[蓝湖指北]如约而至- Sketch 作为一款轻量级的矢量设计工具,凭借其强大的界面设计功能,被大多数 UI 设计师所使用,日渐成为产品研发 ...

  9. 蓝湖怎么切图标注_【蓝湖指北】一张图教你如何选择标注尺寸

    蓝湖的标注.切图功能广受好评,正确选择标注尺寸,让设计师与工程师的沟通和协作事半功倍.本期[蓝湖指北],湖湖将手把手教你如何选择标注尺寸. Step 1 :将设计图上传至蓝湖 上传设计图至蓝湖,单击设 ...

最新文章

  1. java 线程通讯_java多线程(五)线程通讯
  2. linux tomcat端口无法,linux下tomcat无法远程访问(开放8080端口)
  3. Python基础入门必学内容:判断语句与循环语句
  4. 【快乐水题】594. 最长和谐子序列
  5. 一、Git 多人协作模拟实战
  6. Androi App缓存管理
  7. Angular应用启动时创建的injection token一览
  8. 星辰大海:华为用“鲲鹏+昇腾”计算双擎再出发
  9. PostgreSQL SELECT INTO和INSERT INTO SELECT 两种表复制语句
  10. 【原创】大数据基础之Spark(1)Spark Submit即Spark任务提交过程
  11. 设计模式 ( 十九) 中介者模式
  12. 哈密顿图、哈密顿回路
  13. 计算机电路基础第三版清华大学出版社答案,清华大学出版社-图书详情-《计算机电路基础(第2版)》...
  14. Fedora 9 感受
  15. 安徽太极计算机 刘建春,阅读理解的检测作业
  16. win7计算机不在桌面了,怎么办Win7系统开机后不显示桌面
  17. 时空大数据面临的挑战与机遇
  18. 《数据库系统概论》| 第四章 数据库安全性 知识梳理
  19. 咕咕漫画之弹窗破解去除
  20. 关于结构化、半结构化、非结构化数据的理解

热门文章

  1. 【吴恩达deeplearning.ai】Course 5 - 3.3 集束搜索
  2. 两个Listlt;Mapgt;快速合并
  3. 雷达的工作原理示意图_雷达的工作原理是什么?
  4. python密码游戏
  5. 2017 终点亦是起点
  6. 数字逻辑——触发器的选用和使用注意事项
  7. 【读后感】《清单革命》读书笔记
  8. word域锁定和更新
  9. 将矩阵逆时针旋转45°后输出
  10. Python入门习题大全——T恤