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),即接受函数作为参数或返回函数的函数,这有助于构建更灵活的软件架构。

                   这种方式可以更容易地实现组合而不是继承,从而避免了复杂的继承体系带来的问题。

posted @   Peter.Jones  阅读(91)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
点击右上角即可分享
微信分享提示