范文健康探索娱乐情感热点
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

WebFlux前置知识(一)

  WebFlux 也不是一帮人拍脑门突然发明的,它是一个漫长的过程,WebFlux 本身在逐步完善,各种配套工具/理论也在逐步发展。
  因此当想写 WebFlux 的时候,发现没法直接从 WebFlux 本身开始写起,对于很多没有接触过函数式编程的人来说,上来就整 WebFlux 还是有一些挑战的,想来想去,我觉得还是先来和大家捋一捋 JDK8 中的一些旧玩意。
  虽然 JDK8 发布距今已经七八年了,但是相信还是有相当多小伙伴用着 JDK8,写着 JDK6 的代码。所以我们有必要回顾一下 JDK8,也算是我们学习 WebFlux 的一些前置知识。
  好啦,开整吧。  1.Lambda 表达式的四种写法
  JDK8 中引入了 Lambda,这个大家都知道,虽然现在 JDK 都出到 16 了,但是老实说,项目中的 Lambda 表达式似乎还是很少有人用。有的团队技术风格激进,可能会见到很多 Lambda,但是大部分技术团队还是比较保守的。今天为了学习 WebFlux,我们还是先来回顾一下 Lambda 表达式的几种写法。
  先来说说,如果要用 Lambda,必须是只有一个需要强制实现方法的接口,我们可以使用  @FunctionalInterface  注解去标记该接口: @FunctionalInterface interface ICalculator{     int square(int i); }
  此时如果该接口中有多个空方法,编译期间就会报错。
  现在我们建议尽量将一个接口设计的小一些,这样也满足单一职责原则。
  不过 JDK8 中引入了 default 方法,就是自带默认实现的那种,自带默认实现的方法可以有多个,这个并不影响 Lambda,并且  @FunctionalInterface  注解也不会去检查默认方法的数量。 1.1 单个参数的
  如果只是一个参数,那么直接写参数即可,例如如下代码:  interface ICalculator{     int square(int i); } public class LambdaDemo01 {     public static void main(String[] args) {         ICalculator ic = i -> i * i;         int square = ic.square(5);         System.out.println("square = " + square);     } }
  当函数只有一个参数的时候,直接写即可,不需要添加  () 。 1.2 多个参数
  多个参数的话,就需要写上  ()  了,以 Spring Security 中登录成功的回调为例(不了解 Spring Security 的小伙伴可在公号后台回复 ss): .defaultLogoutSuccessHandlerFor((req,resp,auth)->{     resp.setContentType("application/json;charset=utf-8");     Map result = new HashMap<>();     result.put("status", 200);     result.put("msg", "使用 logout1 注销成功!");     ObjectMapper om = new ObjectMapper();     String s = om.writeValueAsString(result);     resp.getWriter().write(s); },new AntPathRequestMatcher("/logout1","GET")) .defaultLogoutSuccessHandlerFor((req,resp,auth)->{     resp.setContentType("application/json;charset=utf-8");     Map result = new HashMap<>();     result.put("status", 200);     result.put("msg", "使用 logout2 注销成功!");     ObjectMapper om = new ObjectMapper();     String s = om.writeValueAsString(result);     resp.getWriter().write(s); },new AntPathRequestMatcher("/logout2","POST")) .and() .csrf().disable();
  这种情况,方法有多个参数,此时使用 Lambda 表达式就需要加上  () 。 1.3 要写参数类型的
  正常来说用 Lambda 时候不需要写上参数类型,但是如果你需要写,就要加上  () ,还是上面那个例子,如下: interface ICalculator{     int square(int i); } public class LambdaDemo01 {     public static void main(String[] args) {         ICalculator ic = (int i) -> i * i;         int square = ic.square(5);         System.out.println("square = " + square);     } } 1.4 方法体不止一行的
  如果方法体不止一行,需要用上  {} ,如果方法体只有一行,则不需要 {} ,参考上面 2、3。 2.函数接口
  JDK8 中自带了函数式接口,使用起来也非常方便。  2.1基本应用
  我们先来看一个简单的例子。
  假设我有一个打招呼的接口 SayHello,SayHello 接口中只有一个 sayHello 方法,然后在 User 类中调用该接口对应的方法,最终用法如下:  @FunctionalInterface interface SayHello {     String sayHello(String name); }  class User {     private String username;      public String getUsername() {         return username;     }      public void setUsername(String username) {         this.username = username;     }      public String say(SayHello sayHello) {         return sayHello.sayHello(this.username);     } }  public class LambdaDemo02 {     public static void main(String[] args) {         User user = new User();         user.setUsername("javaboy");         String say = user.say((username) -> "hello " + username);         System.out.println("say = " + say);     } }
  分析 main 方法中的调用过程之后,我们发现,在调用时最核心的是如下一行代码:  (username) -> "hello " + username
  在这段代码中,我们只关心方法的输入和输出,其他的都不是我所考虑的,为了一个简单的输入输出,我还要额外定义一个接口,这显然不太划算。
  JDK8 中提供了函数接口,可以帮助我们简化上面的接口定义。如下:  class User2 {     private String username;      public String getUsername() {         return username;     }      public void setUsername(String username) {         this.username = username;     }      public String say(Function sayHello) {         return sayHello.apply(this.username);     } } public class LambdaDemo03 {     public static void main(String[] args) {         User2 user2 = new User2();         user2.setUsername("javaboy");         String say = user2.say((username) -> "hello " + username);         System.out.println("say = " + say);     } }
  可以用  Function  代替我们前面的接口定义,这里有两个泛型,第一个泛型表示接口输入的参数类型,第二个泛型表示接口输出的参数类型,而且大家注意,我们最终 main 方法中的调用方式是不变的。有了 Function 函数之后,以后我们就不需要定义一些简单的接口了。
  而且 Function 函数还支持链式操作,如下:  public class LambdaDemo03 {     public static void main(String[] args) {         User2 user2 = new User2();         user2.setUsername("javaboy");         Function func = (username) -> "hello " + username;         String say = user2.say(func.andThen(s -> "你好 " + s));         System.out.println("say = " + say);     } } 2.2 其他函数接口
  接下来我们来看看这些函数接口。  2.2.1 UnaryOperator
  当输入输出类型相同时,可以使用 UnaryOperator 函数接口,例如我们上面的代码,修改之后如下:  class User2 {     private String username;      public String getUsername() {         return username;     }      public void setUsername(String username) {         this.username = username;     }      public String say(UnaryOperator sayHello) {         return sayHello.apply(this.username);     } } public class LambdaDemo03 {     public static void main(String[] args) {         User2 user2 = new User2();         user2.setUsername("javaboy");         UnaryOperator func = (username) -> "helloo " + username;         String say = user2.say(func);         System.out.println("say = " + say);     } } 2.2.2 Predicate
  Predicate 输入一个 T 类型的参数,输出一个 boolean 类型的值。
  举一个简单的例子,例如如下代码,我们定义一个 List 集合中存放着用户姓名,现在要过滤出所有姓张的用户,代码如下:  public class LambdaDemo04 {     public static void main(String[] args) {         List names = Arrays.asList("张三", "里斯", "张五");         List list = names.stream().filter(s -> s.startsWith("张")).collect(Collectors.toList());         for (String s : list) {             System.out.println("s = " + s);         }     } }
  filter 中传入的就是一个 Predicate 函数接口,这个接口接收 String 类型的数据,返回一个 boolean。
  注意
  一些常用类型的函数接口,JDK 中直接提供了相关的类供我们使用,例如  Predicate  可以用 IntPredicate  代替;Consumer  可以用 IntConsumer  代替。 2.2.3 Consumer
  看名字就知道,这个是消费数据,只有输入没有输出。
  例如集合的遍历就可以使用 Consumer 函数接口。  public class LambdaDemo04 {     public static void main(String[] args) {         List names = Arrays.asList("张三", "里斯", "张五");         names.stream().forEach(s -> System.out.println(s));     } } 2.2.4 Supplier
  Supplier 刚好和 Consumer 相反,它只有输出没有输入。有的时候我们的工厂方法没有输入只有输出,这个时候就可以考虑使用 Supplier(如果有输入参数,则可以考虑使用 Function 函数接口)。  Supplier supplier = ()->{     Connection con = null;     try {         con = DriverManager.getConnection("", "", "");     } catch (SQLException e) {         e.printStackTrace();     }     return con; }; Connection connection = supplier.get(); 3.小结
  其实 WebFlux 前置知识还是蛮多的,今天先聊这些吧,我们后面继续。
  转载自:江南一点雨
  原文链接:
  https://mp.weixin.qq.com/s/DiaDtt0nW38RKUqQSNKj4Q

TBC怀旧服伊利丹开不出变身就被打死将成为常态,术士T要失业了相信大家都已经看到了怀旧服P3的PTR战报,从目前的情况来看,T6将是一个非常友好的版本,而且有很多Boss都会被怀旧服玩家打到放不出技能。今天我们来讲一讲伊利丹这个Boss,国服Epic表示最终幻想7重制过渡版不锁国区最终幻想7重制过渡版现已上架Epic,此前售价446元,但是售价现已被隐藏。近日,Epic游戏商店官方博客发文表示,最终幻想7重制过渡版不会锁国区。最终幻想7重制过渡版将于12月1Ale成全明星赛最大赢家,暴打阿Bin获MVP,Doinb已经笑麻了各位LPL的粉丝大家好,欢迎来到小车侃联盟。在昨天举行的全明星赛正赛中Jiejie队以21的大比分战胜了Meiko队,Ale最终也是凭借自己第三局出色表现的青钢影获得了正赛MVP,LPL全明星Solo赛剑姬对决Bin心细手快双杀GALA2021LPL全明星周末首日荣耀日正式到来!在年度颁奖盛典环节期间还进行了紧张激烈的全明星Solo赛,来自各大战队的实力选手通过1v1对决争夺最终的Solo冠军。第二轮采取双败赛制王者荣耀百里守约怎么玩?怎么样才能狙击打准敌人?王者荣耀百里守约怎么玩,怎么才能用狙击打准敌人?Hello大家好,我是金仔。今天来给大家讲一下百里守约的玩法以及他的技巧,我们都知道,百里守约二技能打中敌人是非常疼的,命中几下敌人大话2全服第一人法项链,降价数次却无人接盘对于很多喜欢人族的玩家来说,除了武器之外。最重要的部件就是项链男人在这忽视少之又少的提升情况第二个就是项链了别的不说,先来看一下这条链子的具体属性吧,原始抗封印37,并且还有敏捷加开服天崩,补偿累计折算240抽的终焉誓约,这个瓜有点塞牙诸君安好,雾夏菌报道。近期手游方面又出了一个瓜,一开始我自己也没留意,但耐不住这个瓜是真的硬塞到别人嘴里,因为实在有点狗血。事情经过游戏为终焉誓约,原定是12月9号全网上线的,但在70美元,任天堂SwitchOLED款底座开始单卖支持以太网接口IT之家12月12日消息,任天堂SwitchOLED款相比原版进行了一些改进,其底座添加了以太网接口,官方此前确认底座可单独出售。近日,任天堂在线商店上架了SwitchOLED款底闪耀暖暖心灵迷宫只缺少一个角色,只因大家走不进他的心导读抛开刻板印象,如果小伙伴们仔细回顾一下狗叠在闪耀暖暖中进行的一系列操作,其实总体来看还是利大于弊的。质量有所上升的套装还是大型庆典中不再吝啬的福利甚至连爆率都给人感觉比以前良心碧蓝幻想ReLink除PS5PS4还将登Steam!PV赏Cygames宣布角色扮演游戏新作碧蓝幻想ProjectReLink(GranblueFantasyProjectReLink)除了此前确定的PS5PS4平台外,还将推出Steam游戏圈的智商税,上古卷轴5整合包二三事上古卷轴5天际作为一款十年前的经典老游戏,游戏bug多打击手感差,人物建模丑,但就算是有着这些堪称致命的缺点,时至今日老滚依旧有着极高的人气,除了超高的游戏性和开放世界自由度以外,
热血传奇讲真,这对极品铁手镯比攻4金手镯好吗?热血传奇官方有个壁纸就是天魔战士扛着屠龙的造型,曾经是风靡各大网吧的招牌海报,相信各位老玩家都有印象。不过在现实中玩家记忆最深刻的剑甲搭配却是裁决之杖搭配天魔神甲。天魔战士壁纸因为魔兽世界怀旧服卡拉赞变成了产金圣地,3分钟一门一次大概30金大家好,我是分身有术,很高兴又跟大家见面了。最近随着ptr测试服的开放,导致金价一路上涨,但是涨了没几天金价又开始跌了,这到底是怎么回事呢?那么今天分身和大家简单聊聊。如果有看过我如何一句话激怒游戏玩家?作为一名玩家,不知道大家有没有被一句话给瞬间激怒过。比如玩绝地求生的时候突然被人吐槽这游戏抄和平精英的吧?或者是玩黎明杀机的时候被人冷不丁地戳一句这不是猪厂的第五人格吗?就连当年刷幻塔怎么就成了爬爬塔了?大家好我是小菜鸟陆少白幻塔为何人气那么高?是不是真的如传说中那么好玩,玩法又很丰富呢?为此我也预约了游戏,公测当天几个区都爆满,排队都排了几万名开外,当时就没有玩,直到今天才决定去Steam周销榜光环无限战役二连冠玩具熊新作第二Steam公开了上一周(截止至12月19日)的销量排行榜,光环无限(战役)再次登顶上周销量榜,销量榜第二名是新发售的恐怖游戏玩具熊的五夜后宫安全漏洞,第三名则是好评如潮的战术FPS率土之滨资源产量加成最高的武将,不是弓诸葛,而是何太后自从政策系统上线以来,对于各个武将不同的内政技能,不少玩家都表示眼花缭乱。虽然如此,但弓诸葛等热门内政武将依旧受到了不少玩家都追捧。毕竟这些都是当前公认的最强内政武将,囤积起来总是狂暴传奇等级提升太慢怎么办?高级经验卷合成全解哈喽,大家好,我是阿寻,今天给大家带来狂暴传奇高级经验卷合成的讲解。有喜欢玩游戏的朋友们,也可以私信或者评论我哦!在狂暴传奇里,除了打怪获取经验值外,还能使用经验卷的道具,来快速提部落与弯刀全新玩法,在搏击擂台上称王称霸在部落与弯刀正式版新增的内容里,酒馆搏击无疑是玩家们讨论的热点。这是一个全新的玩法,玩家可以在带领部队征战之余,来到城池内的酒馆放松一下,领略酒馆搏击的魅力。它有一套全新的技能进阶传奇世界元神版传世手游,复刻经典传世,8090玩家的青春回忆大家好,我是你们的老朋友散人,又和大家见面了,当年的传奇史上有句话叫做无兄弟不传奇,其实放在传世上也是一样的,传世是基于传奇之上进行优化和改良的版本,可以说是80后玩家的青春记忆,卧龙三国贵族5怎样获取策略国战手游卧龙三国贵族5简介嗨,各位玩家们大家好啊,策略国战手游卧龙三国贵族5是怎样获取的呢,卧龙三国贵族5获取途径跟随小编一起来看看吧,希望能够给大家带来帮助哦!贵族5特权介绍包含贵族4等级所有特权,聚英馆Steam一周销量榜光环无限战役二连冠,稳居榜首Steam公开新一周(12。1312。19)游戏销量榜光环无限战役二连冠,稳居榜首位置。新游严阵以待强势冲上榜单第3位,战地2042凭借本次折扣优势再次登上销量榜前十,位居第7位。