发布文章后马上更新网站主页,泰州做网站 泰公网络科技公司,网页界面设计的要求,如何修改wordpress代码什么时候可以使用 Lambda#xff1f;通常 Lambda 表达式是用在函数式接口上使用的。从 Java8 开始引入了函数式接口#xff0c;其说明比较简单#xff1a;函数式接口(Functional Interface)就是一个有且仅有一个抽象方法#xff0c;但是可以有多个非抽象方法的接口。 java8…什么时候可以使用 Lambda通常 Lambda 表达式是用在函数式接口上使用的。从 Java8 开始引入了函数式接口其说明比较简单函数式接口(Functional Interface)就是一个有且仅有一个抽象方法但是可以有多个非抽象方法的接口。 java8 引入 FunctionalInterface 注解声明该接口是一个函数式接口。一、语法抽象方法有且仅有一个接口使用 FunctionalInterface 注解进行标注接口中可以存在默认方法和静态方法实现如下形式/*** 定义函数式接口* 接口上标注FunctionalInterface 注解*/FunctionalInterfacepublic interface ICollectionService{/*** 定义打印方法*/void print();}在 Java8 以前已有大量函数式接口形式的接口(接口中只存在一个抽象方法)只是没有强制声明。例如 java.lang.Runnablejava.util.concurrent.Callablejava.security.PrivilegedActionjava.io.FileFilter 等Java8 新增加的函数接口在 java.util.function 包下它包含了很多类用来支持 Java 的函数式编程该包中的函数式接口如下对于 Java8 中提供的这么多函数式接口开发中常用的函数式接口有以下几个 PredicateConsumerFunctionSupplier。二、函数式接口实例2.1 Predicatejava.util.function.Predicate接口定义了一个名叫 test 的抽象方法它接受泛型 T 对象并返回一个 boolean 值。在对类型 T 进行断言判断时可以使用这个接口。通常称为断言型接口 。「字符串判空」Predicate p01(str)-str.isEmpty()||str.trim().isEmpty();/*** 测试传入的字符串是否为空*/System.out.println(p01.test());System.out.println(p01.test( ));System.out.println(p01.test(admin));「用户合法性校验」接口静态方法完成手机号合法校验功能方法返回函数式接口 Predicatepublic interface MyStringInter{public final String checkPhone ^((13[0-9])|(14[5,7,9])|(15([0-3]|[5-9]))|(16[0-9]) |(17[0,1,3,5,6,7,8])|(18[0-9])|(19[8|9]))\\d{8}$;/*** 用户手机格式合法性* 返回L函数式接口Predicate 的实现 Lambda表达式* return*/static Predicate checkPhone(){return (e)- {return Pattern.compile(checkPhone).matcher(e).matches();};}}2.2 Consumerjava.util.function.Consumer接口定义了一个名叫 accept 的抽象方法它接受泛型 T没有返回值(void)。如果需要访问类型 T 的对象并对其执行某些操作可以使用这个接口通常称为消费型接口。「热销商品展示」/**热销商品测试数据*/Goods g01new Goods(1,iPad 2018款,3000,180, BigDecimal.valueOf(2300));Goods g02new Goods(6,小米平板4,5000,600, BigDecimal.valueOf(1900));Goods g03new Goods(9,微软 Surface Pro 6,100,50, BigDecimal.valueOf(8500));Goods g04new Goods(20,华为 荣耀平板5,1600,480, BigDecimal.valueOf(1500));List goods Arrays.asList(g01,g02,g03,g04);//Consumer 实现集合数据输出 Lambda替代匿名函数 实现Consumer接口goods.forEach(g-{System.out.println(g);});2.3 Functionjava.util.function.Function 接口定义了一个叫作 apply 的方法它接受一个泛型 T 的对象并返回一个泛型 R 的对象。如果需要定义一个 Lambda将输入的信息映射到输出可以使用这个接口(比如提取苹果的重量或把字符串映射为它的长度),通常称为功能型接口。「用户密码 Base64 编码」// 实现用户密码 Base64加密操作Function f01(password)-Base64.getEncoder().encodeToString(password.getBytes());// 输出加密后的字符串System.out.println(f01.apply(123456));2.4 Supplierjava.util.function.Supplier接口定义了一个 get 的抽象方法它没有参数返回一个泛型T的对象这类似于一个工厂方法,通常称为功能型接口。「外部Properties文件读取」public static Properties readFile(String fileName){Supplier supplier () - {try {InputStream is TestCase04.class.getClassLoader().getResourceAsStream(fileName);Properties prop new Properties();prop.load(is);return prop;} catch (IOException e) {e.printStackTrace();return null;}};return supplier.get();}三、高阶函数Java8 中函数式接口中方法允许函数接口作为方法形参传入同时方法的结果为函数接口从而实现链式调用操作就像俄罗斯套娃那样当把套娃一个个打开时发现还有一个同样的小套娃在里面最终发现最里面的一个也是一个完整的套娃玩具此时的高阶函数是不是跟套娃有着惊人的相似之处呢。「多页面转发」String action ;Predicate p01 (a) - StringUtils.isBlank(a);/*** 如果action 为空 或 index 或 main 转发到网站主页面* 链式判断 方法结果仍然为一个函数*/if (p01.or((a) - a.equals(index)).or((a) - a.equals(main)).test(action)) {System.out.println(网站主页面...);} else {System.out.println(其他页面...);}「多条件排序」这里以商品数据为例按商品销量、评论排序如果销量一致按照商品评论数排序/*** 实际开发数据通常从数据库获取* 这里使用测试数据*/Goods g01new Goods(1,小米9,1789,200, BigDecimal.valueOf(2500));Goods g02new Goods(2,华为Mate20,5000,3000, BigDecimal.valueOf(7000));Goods g03new Goods(3,OPPO R17,2000,2827, BigDecimal.valueOf(1500));Goods g04new Goods(4,魅族 Note9,2000,1600, BigDecimal.valueOf(1600));Goods g05new Goods(5,一加6T,8000,5000, BigDecimal.valueOf(3500));List goods Arrays.asList(g01,g02,g03,g04,g05);// 销量 与 评论排序 高阶函数使用Comparator comparator (g1,g2)-g1.getSale()-g2.getSale();goods.sort(comparator.thenComparing(Comparator.comparing(g3 - g3.getComment())));goods.forEach((g)-System.out.println(g));高阶函数应用场景较多(这里查看源码相关高阶函数方法)如 Optinal 接口 filter、map 、orElseGet 等方法Stream 流操作等基本都会用到 Predicate, Consumer, Supplier, Function 等接口。四、函数式接口优势与应用场景函数式接口的引入结合 Lambda 的使用消除的匿名函数繁琐的代码使得代码结构简洁、紧凑第二点就是函数式接口中使用高阶函数可以很方便的实现链式调用代码清晰简洁同时引入的一种新的开发思想-函数式编程对于开发者来说只需要关注函数的规则设计实现即可。对于函数式接口应用后续介绍到的 Optinal、Stream 相关方法对于数据处理的使用频率较高同时也是构成函数式编程的核心内容。