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

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

绝地求生永久免费,究竟是什么让蓝洞做出如此的决定2021年12月,蓝洞游戏工作室宣布绝地求生永久免费,但是究竟是因为什么让蓝洞做出如此的决定,这篇文章为大家分析一下。吃鸡的起源还要从一部小说说起。大逃杀(日语,英语BattleR父上村雅之去世,享年78岁据国内媒体报道,上村雅之1943年出生于东京都,1967年进入早川电机工业株式会社(现在的夏普株式会社),在光半导体的光检测器销售部门进行产品的开发和营业活动。1971年上村雅之入英雄联盟乐芙兰介绍乐芙兰诡术妖姬作为黑玫瑰的领袖,乐芙兰的身份和关于她的谣言一样捉摸不定,和给她带来形态的幻影一样转瞬即逝。她自己可能也不知道自己的身份,但毕竟她历经了几百年的模仿和诈骗黑玫瑰的创始惹毛Karsa,气坏阿水!TES纪录片曝光,369摆烂引起众怒哈喽大家好,这里是狗子,每天为您带来有趣的游戏资讯,喜欢的记得点个关注德杯现如今已经打完了两天的比赛,不得不说A组的比赛相比较D组,确实要精彩太多,队伍之间的实力差距也要小不少。而iG又抽卡成功了!德杯首个全胜出线队伍诞生,iG翻盘LGD挺进八强在LPL冬季转会期结束后不久,德玛西亚杯正式开战。这次许多LPL战队都派出了全新阵容以赛代练,为LPL春季赛做准备。在前两个比赛日中,LPL战队都有翻车局出现,WBGTESJDG都纯白花嫁返场方式突变,孙悟空镜新史诗帅哭,宠物系统来袭可乐要加冰,乔妹在你心,大家好我是小乔妹,每天为您分享有趣的王者荣耀新皮肤新版本,最新攻略等文章内容。王者荣耀新赛季即将来袭,新赛季为千色云中赛年,第一个赛季叫玉城危机,是发生在云小岛秀夫的三大游戏巨作,你是他的忠实粉丝吗亲爱的小伙伴们,大家好,我是你们的大T。相信有很多单机游戏玩家,都玩过小岛秀夫制作过的作品,他是日本著名游戏制作人,一直活跃在主机游戏和单机游戏的行业当中,他在二三十年的工作生涯当王者荣耀年龄及性别分布图曝光,来看一下吧有玩家在游戏中遇到坑人的玩家时就会说对方是小学生,甚至有更加极端的人直接就认为游戏中那些坑人的都是妹子。然而看了王者的年龄分段图和性别分布图之后才知道,原来坑人的不止是小学生,而且热血传奇历代版本,持续时间最短的你知道是哪个吗随着版本的更新,封魔谷开放,传奇玩家的热情如火如荼。但是就在这不久之后非典病毒开始席卷全国,公共场合也开始整顿起来,网吧自然不能幸免。直到2003年5月盛大推出了1。75版本江山无热血传奇装备隐藏属性爆料!见过的玩家应该不多吧热血传奇玩家应该知道对于传奇这样的游戏如果拥有一件神级装备对玩家来说是一件非常开心的事,打怪升级什么的都十分的容易,很多玩家都梦寐以求自己能够有一件比较厉害的装备。我们来看看装备。LOL德杯XLB招牌豹女终结C位,V5爆冷击败WBG解锁首胜北京时间12月17日下午,2021德玛西亚杯小组赛首日上半场的收官战由WBG对阵V5!WBG选择了LPL一队阵容,只有上单TheShy缺席,V5野辅则是XLB和ppgod。前期WB
一位动森玩家把自己的岛做成了迷宫,一年后回坑后悔不已国外玩家AveryMonsen在去年游玩集合啦!动物森友会时,决定把自己的整个小岛打造成一个迷宫。最近趁着2。0版本的更新,他想回来看看新内容,结果发现自己的迷宫过于复杂,导致游戏游戏论他山之石丨视频游戏的符号理论分析以屏幕的双重化为中心文吉田宽(东京大学大学院人文社会系研究科副教授)译李鹏飞(首都师范大学国际文化学院助理研究员)1视频游戏中界面价值的完全发挥MIT(麻省理工学院)的临床心理学家雪莉特克尔(Sher16级的爹又回来了!季前赛这几件装备让卡萨丁玩家狂喜众所周知,在英雄联盟里有这么一句话,16级的爹有很多,但16级的爷爷只有一个,那就是卡萨丁。16级一秒一个大招直接变战神。而这种情况在S11却发生了改变,这是怎么回事呢?由于S11麻麻问我为什么跪着玩游戏!这款国产游戏的产品策划太会搞事了说出来你可能不信,刚开始,我明明装的是一款大型的回合游戏手游,我每天坚持做日常任务,然后满心欢喜的看着我的角色慢慢成长。最近可倒好,日常任务一键就能完成,剩下的时间就是每天被街坊好区块链游戏Planet,冒险类NFT游戏开发自从区块链游戏AxieInfinity去年在疫情期间火起来后,游戏发展商纷纷寻求建立新的GameFi游戏平台,已追上NFT游戏赚钱热潮。越来越多的人开始抢占区块链市场。出现了各种各好玩的室内室外集体活动团建小游戏团队集体活动的时候必然离不开团建小游戏,一起做一些好玩小游戏可以让团队的气氛以及融合很快的提升,小编准备了一些适合室内室外的集体活动团建游戏,都特别好玩有趣,极力推荐大家在做团体活Dota2的SA出连击刀容易触发晕锤效果,为什么力丸出散失而不是连击刀呢?力丸自改版之后,他的后期能力比之前更强,所以很多时候会出现在大哥位置上,而不是只会逛街的4号位,对于出装的选择,肯定也是要有一定后期能力的输出装,对于连击刀和散失这两个装备,玩家们动森最新博物馆日活动开启大量独特装饰品登场任天堂5月18日今天宣布,旗下人气游戏集合啦!动物森友会最新时令活动国际博物馆日开启,除了大量独特装饰品登场外,玩家小伙伴踊跃参加活动可以得到更多纪念品。集合啦!动物森友会是任天堂王者荣耀5。20司空震遭削弱,庄周鸟枪换炮,李信王者归来前言在5。185。20这两天中,体验服进行两次版本更新分别对4名英雄调整,优化技能释放显示,以及强化风暴龙王的终结比赛的作用。跟随雨泽一起看看吧!李信觉醒前形态被动技能普攻和二技能全新功夫游戏师父发布战斗演示,白眉拳法威力十足之前开发过截拳道功夫游戏赦免者的Sloclap开发制作了一款全新的功夫游戏师父,近日该作发布了全新的战斗演示画面,可以看到拳拳到肉流畅和威力十足的打斗场面,一起来看看详情吧!在最新天怎么亮了18款耐玩的Switch游戏本内容来源于什么值得买APP,观点仅代表作者本人作者风语叔W创作立场声明本文仅代表作者个人喜好及观点,如有不同看法欢迎友善讨论。部分资料整理难免出现疏漏,如若有误还望评论区指出。今