Lambda表达式-复习20240731
package com.iyungu.booking.model.dto; import com.iyungu.api.his.model.vo.HisBookingDoctorVo; import com.iyungu.api.model.dto.BookingLockNumDTO; import com.iyungu.api.model.vo.BookingLockNumVO; import com.iyungu.api.model.vo.DoctorDetailVO; import com.iyungu.api.model.vo.base.DepartmentInfoVo; import com.iyungu.api.model.vo.manage.PatientInfoVo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; import lombok.Setter; import lombok.experimental.Accessors; import java.time.LocalDateTime; import java.util.Date; import java.util.function.*; import java.util.stream.Stream; @Getter @Setter @Accessors(chain = true) @ApiModel("预约挂号-创建-入参-内部") public class BookingCreateDTO { @ApiModelProperty(value = "患者") private PatientInfoVo patientInfo; @ApiModelProperty(value = "医生") private DoctorDetailVO doctorDetail; @ApiModelProperty(value = "科室") private DepartmentInfoVo departmentInfo; @ApiModelProperty(value = "his号源出参") private HisBookingDoctorVo hisBookingDoctorVo; @ApiModelProperty(value = "his锁号入参") private BookingLockNumDTO hisLockDto; @ApiModelProperty(value = "his锁号出参") private BookingLockNumVO hisLockVo; @ApiModelProperty(value = "业务单号") private String threeOrderNo; @ApiModelProperty(value = "支付单号") private String orderNo; @ApiModelProperty(value = "微信小程序/公众号openid") private String openId; @ApiModelProperty(value = "预约渠道(offline:线下;yungu:云谷 else:其它 参考 ChannelEnum") private String channel; @ApiModelProperty(value = "来源0-小程序 1-微信公众号") private Integer source; public static class Demo01Fun { public static void main(String[] args) { // Supplier 无参有返回值 Supplier<Integer> supplier = () -> 10; System.out.println(supplier.get()); System.out.println("======================================"); // Consumer 有参无返回值 Consumer<String> consumer1 = msg -> System.out.println(msg.toLowerCase()); Consumer<String> consumer2 = msg -> System.out.println(msg.toUpperCase()); consumer1.andThen(consumer2).accept("Test"); //先执行consumer1, 后consumer2, 入参是同一个 System.out.println("======================================"); // Function 有参有返回值 Function<String,String> function1 = msg -> { System.out.println("f1:" + msg); return msg.toLowerCase(); }; Function<String,String> function2 = msg -> { System.out.println("f2:" + msg); return msg.toUpperCase(); } ; System.out.println(function1.andThen(function2).apply("Jest")); //先执行f1, 后f2, f1返回值作为f2的入参 System.out.println(function1.compose(function2).apply("Aest")); //先执行f2, 后f1, f2返回值作为f1的入参 System.out.println("======================================"); // Predicate 有参且有返回值为Boolean Predicate<String> predicate1 = msg -> msg.contains("T"); Predicate<String> predicate2 = msg -> msg.contains("W"); System.out.println(predicate1.and(predicate2).test("test")); System.out.println(predicate1.or(predicate2).test("test")); System.out.println(predicate1.negate().test("test")); // 方法引用 :: 解决lambda表达式冗余问题 // 对象::方法名 // 类名::普通方法 // 类名::静态方法 // 类名::new // 数组 String[]::new LocalDateTime now = LocalDateTime.now(); Supplier<Integer> supplier11 = () -> now.getMinute(); //原: lambda表达式 Supplier<Integer> supplier12 = now::getMinute; //新: 方法引用: 对象-普通方法 Function<LocalDateTime, Integer> function11 = LocalDateTime::getMinute; //方法引用: 类名-普通方法 System.out.println(function11.apply(LocalDateTime.now())); Function<String, Integer> function12 = String::length; //方法引用: 类名-普通方法 System.out.println(function12.apply("test")); BiFunction<String,Integer,String> biFunction12 = String::substring; //方法引用: 类名-普通方法 System.out.println(biFunction12.apply("test", 1)); Supplier<Long> supplier21 = () -> System.currentTimeMillis(); //原: lambda表达式 Supplier<Long> supplier22 = System::currentTimeMillis; //方法引用: 类名-静态方法 Supplier supplier31 = () -> new Date(); //原 Supplier supplier32 = Date::new; //方法引用: 类名::new // 集合的流式处理 //Stream和IO流(InputStream/OutputStream)没有任何关系,请暂时忘记对传统IO流的固有印象! //Stream流式思想类似于工厂车间的“生产流水线”,Stream流不是一种数据结构,不保存数据,而是对数据进行加工 //处理。Stream可以看作是流水线上的一个工序。在流水线上,通过多个工序让一个原材料加工成一个商品。 //1. Stream只能操作一次 //2. Stream方法返回的是新的流 Stream<String> a1 = Stream.of("a1", "a2", "a3"); Stream<Integer> a2 = Stream.of(1, 2, 3); Integer total = Stream.of("1", "2", "3") .map(Integer::parseInt) .reduce(0, Integer::sum); boolean flag = Stream.of("1", "2", "3") .mapToInt(Integer::parseInt) .allMatch(origin -> origin > 5); Stream.concat(Stream.of("1", "2", "3"), Stream.of("4", "5", "6")).forEach(System.out::println); // Optional 解决空指针 } public static void fun1(Operator operator){ int[] arr = {1,2,3,4}; int sum = operator.getSum(arr); System.out.println("sum = " + sum); } private static void fun1(Supplier<Integer> supplier){ // get() 是一个无参的有返回值的 抽象方法 Integer max = supplier.get(); System.out.println("max = " + max); } } @FunctionalInterface interface Operator{ int getSum(int[] arr); } }
接口编程
注解编程
函数式编程 :更好的抽象和模块化: 函数式编程鼓励使用高阶函数(Higher-Order Functions),即接受函数作为参数或返回函数的函数,这有助于构建更灵活的软件架构。
这种方式可以更容易地实现组合而不是继承,从而避免了复杂的继承体系带来的问题。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析