淅奇妈的笔记干货来啦~

一、环境配置支撑:java 11 JDK,Lambok插件,以IDEA为例,确保Annotation Processors中Enable annotaion processing勾选,Lambok plugin中各项勾选。

二、概念及特点:

概念:函数编程强调结果而不是执行过程,利用若干简单的执行单元使得计算结果不断逐层运算。每一次计算都使用上一次计算的结果,函数使用可以更简单处理和更专注于代码逻辑。

特点:a)使用函数不会改变入参函数值; b)函数参数可以多个,返回值也可以是一个函数;

例子1:

.skip(1)跳过一个元素,.peek打印出每个元素,.collection最后收集成一个新的集合。

orderList.stream().skip(1).peek(name->log.debug("order:{}",order.getOrderId())).collection(Collectors.toList());

例子2:

取除了玩具类的,价格前三的订单编码,并输出:

.filter过滤玩具类,.sorted价格倒序,.limit(3)限制前三,.map(Order::getOderId)取订单编码,.distinct去重,.forEach循环遍历打印输出

order->{...}是Lamda表达式的写法,->左边是参数列表,右边是函数体

Order::getOderId方法引用,class::method

orderList stream().filter(order->{"玩具".equals(b.getOrderTypeName)}).sorted((order1,order2)->order2.getPrice().compareTo(order1.getPrice())).limit(3).map(Order::getOderId).distinct().forEach(System.out::println);

三、语法:

Lamda表达式,方法引用 class::method:

1、静态方法引用

//调用订单类B中的静态查询方法,Combine中会对数据进行去重
//Combine combine = (a,b)->OrderB.findOrder(a,b);
Combine combine = (a,b)->OrderB::findOrder;

2、参数方法引用

//BinFuntion是一个函数式接口,支持输入两个参数,返回一个参数
//BiFunction<String.String,Interger> param = (a,b)->a.indexOf(b);
BiFunction<String,String,Interger> param = String::indexOf;

3、实例方法引用

/*构建流使用.builder().build();
Supplier是一个函数式接口,提供者,其接口方法get();*/
Order order = Order.builder().orderTypeName("玩具").build();
//Supplier<String> supplier = ()->order.getOrderTypeName();
Supplier<String> supplier = order::getOrderTypeName;

4、构造器引用

//Supplier<Order> supplier = ()->new Order();
Supplier<Order> supplier = Order::new;

四、函数式接口

有且仅有一个为实现的非静态方法的接口叫做“函数式接口”。以下是jdk提供的一些接口

Function函数,Function<入参类型,出参类型>

//Function表示一个函数,Function<入参类型,出参类型>
Function<Long,Long> num = (value)->value + 3 //此步还没有真正修改值
Long resultNum = num.apply((long)8);//真正赋值

Predicate函数,只取一个值作为参数,并返回true或false

Predicate<Object> predicate = (value)->null != value; 

UnaryOperator函数,入参和出参类型相同

UnaryOperator<Order> unaryOperator = (order)=>{order.setName("玩具");return order;
}

BinaryOperator函数,两个入参返回一个值得操作

BinaryOperator<Long> num = (a,b)->a+b;

Supplier函数,提供商、提供值

Supplier<Interger> supplier = ()=>(int)(Math.random()*1000D);

Consumer函数,一个入参但不返回任何值

Consumer<Interger> consumer = (value)->log.debug("{}",value);

注:函数之间可以组合,例如and/or/compose/andthen等

Function<Interger,Interger> a = (value)->value*value;Function<Interger,Interger> b = (value)->2*value;//组合执行,先执行b,再执行aFunction<Interger,Interger> aAndB = a.compose(b)

五、流创建

第一种方式:Arrays.stream

//创建流,arrayList数组转换成流
Array.stream(arrayList).peek(order=>log.debug("order:{}",order))//打印.collect(Collectors.toList())//重新装入新集合
//比较两组集合的长度
assertEquals(arrayList.size(),newList.size());

第二种方式:Collection.stream

/*
底层实现:StreamSupport.stream(spliterator(),false);
代码实现:  val itr = orderList.iterator(); -- 将list集合放入迭代器,利用迭代器生成流Spliterator<Order> spliterator.spliteratorUnknownSize(itr,Spliterator.NONNULL);Stream<Order> orderStream = StreamSupport.stream(spliteratorfalse);val list = orderStream.peek(order->log.debug("order:{}",order)).collect(Collectors.toList());*/
//创建流
val list = orderList.stream().speek(order->log.debug("order:{}",order)).collect(Collectors.toList());

第三种方式:Stream.of

//括号中可以任意数组下标的元素组成集合,也可以直接给整个数组集合或者重新实例一个新的
val list = Stream.of(arrayList[0],arrayList[1],arrayList[3]).speek(order->log.dubug("order:{}",order)).collect(Collectors.List());    

第四种方式:Stream.iterate【迭代器】

val list = Stream.iterate(0,n->n+1).limit(10).speek(order->log.dubug("order:{}",order)).collect(Collectors.toList());

第五种方式:Stream.generate【可以理解成工厂方法】,以随机数为例

val list = Stream.generate{()->Math.random()}.limit(10).speek(order->log.debug("order:{}",order)).collect(Collectors.toList());

第六种方式:IntStream【整型流】

val list = IntStream(0,5)//(0,5)左闭右开,左边包含右边不包含.boxed()//boxed转换成对象,Stream<Interger>.peek(i->log.debug("num:{}",i)).collect(Collectors.toList());

第七中方式:Stream.builder()

Stream.Builder<Order> sb = Stream.builder();
val list = sb.add(arrayOfOrders[0]).add(arrayOfOrders[1]).add(arrayOfOrders[2]).build().skip(1)//第1个元素不要.peek(order->log.debug("order:{}",order.getOrderId)).collect(Collectors.toList());

六、常用基本操作符

1、中间操作符:filter,map【可多个使用,做值的变换】,peek,findAny【返回任意一个】,findFirst
2、终端操作符:forEach,anyMatch【任何匹配】,noneMatch【任何不匹配】,count,min,max

例:findFirst

//查玩具订单中价格最高的一个
val first:Optional<Order> = orderList.stream().filter(order->order.getOrderName().equals("玩具")).sorted((order1,order2)->order2.getPrice().comparaTo(order1.getPrice())).findFirst()
asserTrue(first.ispresent());//.ispresent()判断是否有值

例:forEach

/*
//原写法
for(Order order: orders){order.setOrderState("1"));
}
assertTrue(orderList.get(1).isEnabled());
*/
aList.stream().forEach(order->order.setOrderState("1"));

例:anyMatch

//查找编码满足10023开头的订单
//val existed:Object = orderList.stream()
//        .filter(order->order.getOrderId().startsWith("10023")).count()>0predicate<Order> orderAnyMaths = order->order.getOrderId().startsWith("10023");
val existed:Object = orderList.stream().anyMath(orderAnyMaths);/*
.anyMath(...)等同于.filter(...).count()>0,
但.anyMath相比.filter(...).count()>0具有短路的优势*/

例:max

Optional<Order> priceMax =  orderList.stream().max(Comparator.comparing(Order::getPrice()));
assertTrue(priceMax.ispersent());

java函数使用笔记(一)相关推荐

  1. java语言基础笔记——语句,函数

    java语言基础笔记 语句 判断结构(重点) 三种格式: 第一种:   if(条件表达式){ 执行语句;         }   System.out.println();   举例:   int a ...

  2. 转载:mongoDB java驱动学习笔记

    http://www.blogjava.net/watchzerg/archive/2012/09/22/388346.html mongoDB java驱动学习笔记 指定新mongo实例: Mong ...

  3. Java中大数据数组,Java基础学习笔记之数组详解

    摘要:这篇Java开发技术栏目下的"Java基础学习笔记之数组详解",介绍的技术点是"java基础学习笔记.基础学习笔记.Java基础.数组详解.学习笔记.Java&qu ...

  4. java多线程学习笔记。

    java多线程学习笔记 线程的优缺点: 多线程的好处: 充分利用多处理核心,提高资源的利用率和吞吐量. 提高接口的响应效率,异步系统工作. 线程的风险: 安全危险(竞争条件):什么坏事都没有发生.在没 ...

  5. 2022疫情缩水,啃透这份399页Java架构知识点笔记,已从13K涨到25K

    本来已经在为去大厂工作摩拳擦掌的Java朋友,社招又是需要5年以上的,今年显得格外艰难: 就业人数高达874万!人才竞争加剧! 疫情让大多数公司的招聘需求缩减!对社招来说,人才招聘要求愈来愈高! 别说 ...

  6. Java虚拟机学习笔记(一)—Java虚拟机概述

    一:编程语言兼容底层系统的方式大概分为两种 1.通过编译器实现兼容 例如C.C++等编程语言,既能运行与Linux系统,也能运行与Windows系统:既能运行于x86平台,也能运行于AMD平台.这种能 ...

  7. 51自学网-Java基础视频教程-笔记 最后修改于2020/9/9

    Java基础视频教程笔记 简介 正文 ==JVM Java Virtual Machine== 栈区 Stack Segment 堆区 Heap Segment 静态区 Data Segment 代码 ...

  8. java语言程序设计 笔记_Java语言程序设计笔记

    本文主要向大家介绍了Java语言程序设计笔记,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. 对象的自动清除 · 对象回收是由垃圾回收线程负责 · System.gc()方法可以要求系 ...

  9. Java入门教程笔记(一)

    Java入门教程笔记(一) Java入门教程笔记系列仅适用于有过一定编程基础的人学习java时进行参考和借鉴 不适用于作为入门级教程 以下凡"小黑窗"都是表示"DOS命令 ...

最新文章

  1. 修改数据表部分字段方法封装-及-动态生成对象并动态添加属性
  2. orb-slam a versatile and accurate monocular slam system
  3. Codejam Qualification Round 2019
  4. 信息图形化探索:图形化简历
  5. sed 以及 awk用法
  6. 高级I/O-----dup/dup2
  7. 图像空域增强:直方图方法
  8. 趣味概率问题:脑洞蒙特卡洛模型,来招聘!!!
  9. 使用Aria2+AriaNG+FileManager来进行离线BT下载及在线播放
  10. Mysql数据库实现分页查询
  11. INT 10H 中断简介
  12. Multisim里导入没有的元器件(以NPN型三极管2N9013为例)
  13. Docker基础25--5.6 配置docker远程服务
  14. PIPIOJ1166PIPI的棋盘
  15. IT硬件名人堂:40年经典产品和背后的故事(组图)
  16. GIMP实用技巧学习(二)
  17. pyautogui自动化控制鼠标和键盘操作
  18. mybatis的插入与批量插入的返回ID的原理
  19. 对于二维数组,如何用Arrays.sort()进行排序以及理解------通俗易懂,条理清晰
  20. 【elasticsearch】elasticsearch教程 es整合springboot教程 kibana安装教程 解决kibana访问404

热门文章

  1. 联想台式计算机电源,联想台式电脑的电源开关按键在什么位置
  2. 第五章第四题(将英里转换成千米)(Conversion from mile to kilometer)
  3. 计算方法--方程求根
  4. revit插件:快速创建踢脚线连同墙体一起画,4步完成
  5. 写代码写了好几年,才发现自己天天都在用设计模式!
  6. 挑战我的年华,赢我光辉岁月
  7. 电脑经常报app crashed-writeminidump问题
  8. Rectangle类介绍
  9. 20230210使AIO-3568J开发板在Android12下调通3个USB
  10. oracle saiku_多维数据分析引擎Saiku的安装使用