收藏 分销(赏)

Java8从入门到精通.pdf

上传人:Stan****Shan 文档编号:1241135 上传时间:2024-04-19 格式:PDF 页数:114 大小:1.38MB 下载积分:25 金币
下载 相关 举报
Java8从入门到精通.pdf_第1页
第1页 / 共114页
Java8从入门到精通.pdf_第2页
第2页 / 共114页


点击查看更多>>
资源描述
目录作者简介2第一章 Java8 总览81.1 Java8 有哪些新特性?81.2 Java8 有哪些优点?9第二章 Lambda 表达式102.1 什么是 Lambda 表达式?102.2 匿名内部类102.3 Lambda 表达式112.4 对比常规方法和 Lambda 表达式122.5 匿名类到 Lambda 表达式222.6 Lambda 表达式的语法232.7 函数式接口262.8 Lambda 表达式典型案例282.8.1 案例一282.8.2 案例二312.8.3 案例三33第三章 函数式接口总览353.1 四大核心函数式接口总览353.2 其他函数接口总览353.3 四大核心函数式接口373.3.1 Consumer 接口373.3.2 Supplier 接口383.3.3 Function 接口383.3.4 Predicate 接口40第四章 Java7 与 Java8 中的 HashMap424.1 JDK8 HashMap 重排序424.2 筛选与切片424.3 中间操作424.4 终止操作434.5 规约操作434.6 Optional 容器类44第五章 方法引用与构造器引用455.1 方法引用455.2 构造器引用465.3 数组引用47第六章 Java8 中的 Stream486.1 什么是 Stream?486.2 Stream 操作的三个步骤486.3 如何创建 Stream?496.4 Stream 的中间操作506.5 Stream 的终止操作526.6 并行流与串行流566.7 Fork/Join 框架566.8 Stream 概述596.9 如何创建 Stream 流?606.10 Stream 的中间操作656.11 筛选与切片656.12 映射706.13 排序736.14 Stream 的终止操作746.15 查找与匹配746.16 规约796.17 收集816.18 如何收集 Stream 流?826.19 并行流实例85第七章 Optional 类867.1 什么是 Optional 类?867.2 Optional 类示例86第八章 默认方法968.1 接口中的默认方法968.2 默认方法的原则968.3 接口中的静态方法99第九章 本地时间和时间戳1009.1 使用 LocalDate、LocalTime、LocalDateTime1009.2 Instant 时间戳1039.3 Duration 和 Period1039.4 日期的操作1049.5 解析与格式化1069.6 时区的处理1069.7 与传统日期处理的转换110第十章 Java8 对注解的增强111第一章 Java8 总览第一章 Java8 总览1.2 Java8 有哪些优点?简单来说 Java8 优点如下所示。速度更快代码更少(增加了新的语法 Lambda 表达式)强大的 Stream API便于并行最大化减少空指针异常 Optional第二章 Lambda 表达式10第二章 Lambda 表达式2.1 什么是 Lambda 表达式?Lambda 表达式是一个匿名函数,我们可以这样理解 Lambda 表达式:Lambda 是一段可以传递的代码(能够做到将代码像数据一样进行传递)。使用 Lambda 表达式能够写出更加简洁、灵活的代码。并且,使用 Lambda 表达式能够使 Java 的语言表达能力得到提升。2.2 匿名内部类在介绍如何使用 Lambda 表达式之前,我们先来看看匿名内部类,例如,我们使用匿名内部类比较两个 Integer 类型数据的大小Comparator com=newnew Comparator()Overridepublicpublic int compare(Integer o1,Integer o2)returnreturn Ipare(o1,o2);在上述代码中,我们使用匿名内部类实现了比较两个 Integer 类型数据的大小。接下来,我们就可以将上述匿名内部类的实例作为参数,传递到其他方法中了,如下所示。TreeSet treeSet=newnew TreeSet(com);完整的代码如下所示。11第二章 Lambda 表达式Testpublicpublic void test1()Comparator com=newnew Comparator()Overridepublicpublic int compare(Integer o1,Integer o2)returnreturn Ipare(o1,o2);TreeSet treeSet=newnew TreeSet(com);我们分析下上述代码,在整个匿名内部类中,实际上真正有用的就是下面一行代码。returnreturn Ipare(o1,o2);其他的代码本质上都是“冗余”的。但是为了书写上面的一行代码,我们不得不在匿名内部类中书写更多的代码。2.3 Lambda 表达式如果使用 Lambda 表达式完成两个 Integer 类型数据的比较,我们该如何实现呢?Comparator com=(x,y)-Ipare(x,y);看到没,使用 Lambda 表达式,我们只需要使用一行代码就能够实现两个 Integer 类型数据的比较。我们也可以将 Lambda 表达式传递到 TreeSet 的构造方法中,如下所示。TreeSet treeSet=newnew TreeSet(x,y)-Ipare(x,y);直观的感受就是使用 Lambda 表达式一行代码就能搞定匿名内部类多行代码的功能。第二章 Lambda 表达式12看到这,不少读者会问:我使用匿名内部类的方式实现比较两个整数类型的数据大小并不复杂啊!我为啥还要学习一种新的语法呢?其实,我想说的是:上面咱们只是简单的列举了一个示例,接下来,咱们写一个稍微复杂一点的例子,来对比下使用匿名内部类与 Lambda 表达式哪种方式更加简洁。2.4 对比常规方法和 Lambda 表达式例如,现在有这样一个需求:获取当前公司中员工年龄大于 30 岁的员工信息。首先,我们需要创建一个 Employee 实体类来存储员工的信息。DataBuilderToStringNoArgsConstructorAllArgsConstructorpublicpublic classclass Employee implementsimplements Serializable privateprivate static final long serialVersionUID=-9079722457749166858L;privateprivate String name;privateprivate Integer age;privateprivate Double salary;在 Employee 中,我们简单存储了员工的姓名、年龄和薪资。接下来,我们创建一个存储多个员工的 List 集合,如下所示。protected List employees=Arrays.asList(new Employee(张三,18,9999.99),new Employee(李四,38,5555.55),new Employee(王五,60,6666.66),13第二章 Lambda 表达式new Employee(赵六,16,7777.77),new Employee(田七,18,3333.33););1.常规遍历集合我们先使用常规遍历集合的方式来查找年龄大于等于 30 的员工信息。publicpublic List filterEmployeesByAge(List list)List employees=newnew ArrayList();forfor(Employee e:list)if if(e.getAge()=30)employees.add(e);returnreturn employees;接下来,我们测试一下上面的方法。Testpublicpublic void test3()List employeeList=filterEmployeesByAge(thisthis.employees);forfor(Employee e:employeeList)System.out.println(e);运行 test3 方法,输出信息如下所示。Employee(name=李四,age=38,salary=5555.55)Employee(name=王五,age=60,salary=6666.66)第二章 Lambda 表达式14总体来说,查找年龄大于或者等于 30 的员工信息,使用常规遍历集合的方式稍显复杂了。例如,需求发生了变化:获取当前公司中员工工资大于或者等于 5000 的员工信息。此时,我们不得不再次创建一个按照工资过滤的方法。publicpublic List filterEmployeesBySalary(List list)List employees=newnew ArrayList();forfor(Employee e:list)if if(e.getSalary()=5000)employees.add(e);returnreturn employees;对比 filterEmployeesByAge()方法和 filterEmployeesBySalary 方法后,我们发现,大部分的方法体是相同的,只是 for 循环中对于条件的判断不同。如果此时我们再来一个需求,查找当前公司中年龄小于或者等于 20 的员工信息,那我们又要创建一个过滤方法了。看来使用常规方法是真的不方便啊!这里,问大家一个问题:对于这种常规方法最好的优化方式是啥?相信有不少小伙伴会说:将公用的方法抽取出来。没错,将公用的方法抽取出来是一种优化方式,但它不是最好的方式。最好的方式是啥?那就是使用 设计模式 啊!设计模式可是无数前辈不断实践而总结出的设计原则和设计模式。大家可以查看设计模式汇总你需要掌握的 23 种设计模式都在这儿了!一文来学习设计模式专题。2.使用设计模式优化代码如何使用设计模式来优化上面的方法呢,大家继续往下看,对于设计模式不熟悉的同学可以先15第二章 Lambda 表达式根据设计模式汇总你需要掌握的 23 种设计模式都在这儿了!来学习。我们先定义一个泛型接口 MyPredicate,对传递过来的数据进行过滤,符合规则返回 true,不符合规则返回 false。publicpublic interfaceinterface MyPredicate/*对传递过来的T类型的数据进行过滤*符合规则返回true,不符合规则返回false*/boolean filter(T t);接下来,我们创建 MyPredicate 接口的实现类 FilterEmployeeByAge 来过滤年龄大于或者等于30 的员工信息。publicpublic classclass FilterEmployeeByAge implementsimplements MyPredicate Overridepublicpublic boolean filter(Employee employee)returnreturn employee.getAge()=30;我们定义一个过滤员工信息的方法,此时传递的参数不仅有员工的信息集合,同时还有一个我们定义的接口实例,在遍历员工集合时将符合过滤条件的员工信息返回。/优化方式一publicpublic List filterEmployee(List list,MyPredicate myPredicate)List employees=newnew ArrayList();forfor(Employee e:list)if if(myPredicate.filter(e)employees.add(e);第二章 Lambda 表达式16returnreturn employees;接下来,我们写一个测试方法来测试优化后的代码。Testpublicpublic void test4()List employeeList=thisthis.filterEmployee(thisthis.employees,newnew FilterEmployeeByAge();forfor(Employee e:employeeList)System.out.println(e);运行 test4()方法,输出的结果信息如下所示。Employee(name=李四,age=38,salary=5555.55)Employee(name=王五,age=60,salary=6666.66)写到这里,大家是否有一种豁然开朗的感觉呢?没错,这就是设计模式的魅力,对于设计模式不熟悉的小伙伴,一定要参照设计模式汇总你需要掌握的 23 种设计模式都在这儿了!来学习。我们继续获取当前公司中工资大于或者等于 5000 的员工信息,此时,我们只需要创建一个FilterEmployeeBySalary 类实现 MyPredicate 接口,如下所示。publicpublic classclass FilterEmployeeBySalary implementsimplements MyPredicateOverridepublicpublic boolean filter(Employee employee)returnreturn employee.getSalary()=5000;17第二章 Lambda 表达式接下来,就可以直接写测试方法了,在测试方法中继续调用 filterEmployee(List list,MyPredicate myPredicate)方法。Testpublicpublic void test5()List employeeList=thisthis.filterEmployee(thisthis.employees,newnew FilterEmployeeBySalary();forfor(Employee e:employeeList)System.out.println(e);运行 test5 方法,输出的结果信息如下所示。Employee(name=张三,age=18,salary=9999.99)Employee(name=李四,age=38,salary=5555.55)Employee(name=王五,age=60,salary=6666.66)Employee(name=赵六,age=16,salary=7777.77)可以看到,使用设计模式对代码进行优化后,无论过滤员工信息的需求如何变化,我们只需要创建 MyPredicate 接口的实现类来实现具体的过滤逻辑,然后在测试方法中调用 filterEmployee(List list,MyPredicate myPredicate)方法将员工集合和过滤规则传入即可。这里,问大家一个问题:上面优化代码使用的设计模式是哪种设计模式呢?如果是你,你会想到使用设计模式来优化自己的代码吗?小伙伴们自己先思考一下到底使用的设计模式是什么?文末我会给出答案!使用设计模式优化代码也有不好的地方:每次定义一个过滤策略的时候,我们都要单独创建一个过滤类!第二章 Lambda 表达式183.匿名内部类那使用匿名内部类是不是能够优化我们书写的代码呢,接下来,我们就使用匿名内部类来实现对员工信息的过滤。先来看过滤年龄大于或者等于 30 的员工信息。Testpublicpublic void test6()List employeeList=thisthis.filterEmployee(thisthis.employees,newnew MyPredicate()Overridepublicpublic boolean filter(Employee employee)returnreturn employee.getAge()=30;);forfor(Employee e:employeeList)System.out.println(e);运行 test6 方法,输出如下结果信息。Employee(name=李四,age=38,salary=5555.55)Employee(name=王五,age=60,salary=6666.66)再实现过滤工资大于或者等于 5000 的员工信息,如下所示。Testpublicpublic void test7()List employeeList=thisthis.filterEmployee(thisthis.employees,newnew MyPredicate()Overridepublicpublic boolean filter(Employee employee)returnreturn employee.getSalary()=5000;19第二章 Lambda 表达式);forfor(Employee e:employeeList)System.out.println(e);运行 test7 方法,输出如下结果信息。Employee(name=张三,age=18,salary=9999.99)Employee(name=李四,age=38,salary=5555.55)Employee(name=王五,age=60,salary=6666.66)Employee(name=赵六,age=16,salary=7777.77)匿名内部类看起来比常规遍历集合的方法要简单些,并且将使用设计模式优化代码时,每次创建一个类来实现过滤规则写到了匿名内部类中,使得代码进一步简化了。但是,使用匿名内部类代码的可读性不高,并且冗余代码也比较多!那还有没有更加简化的方式呢?4.重头戏:Lambda 表达式在使用 Lambda 表达式时,我们还是要调用之前写的 filterEmployee(List list,MyPredicate myPredicate)方法。注意看,获取年龄大于或者等于 30 的员工信息。Testpublicpublic void test8()filterEmployee(thisthis.employees,(e)-e.getAge()=30).forEach(System.out:println);第二章 Lambda 表达式 e.getSalary()=5000).forEach(System.out:println);没错,使用 Lambda 表达式,又是一行代码就搞定了!运行 test9 方法,输出如下的结果信息。Employee(name=张三,age=18,salary=9999.99)Employee(name=李四,age=38,salary=5555.55)Employee(name=王五,age=60,salary=6666.66)Employee(name=赵六,age=16,salary=7777.77)另外,使用 Lambda 表达式时,只需要给出需要过滤的集合,我们就能够实现从集合中过滤指定规则的元素,并输出结果信息。5.重头戏:Stream API使用 Lambda 表达式结合 Stream API,只要给出相应的集合,我们就可以完成对集合的各种过滤并输出结果信息。21第二章 Lambda 表达式例如,此时只要有一个 employees 集合,我们使用 Lambda 表达式来获取工资大于或者等于 5000 的员工信息。Testpublicpublic void test10()employees.stream().filter(e)-e.getSalary()=5000).forEach(System.out:println);没错,只给出一个集合,使用 Lambda 表达式和 Stream API,一行代码就能够过滤出想要的元素并进行输出。运行 test10 方法,输出如下的结果信息。Employee(name=张三,age=18,salary=9999.99)Employee(name=李四,age=38,salary=5555.55)Employee(name=王五,age=60,salary=6666.66)Employee(name=赵六,age=16,salary=7777.77)如果我们只想要获取前两个员工的信息呢?其实也很简单,如下所示。Testpublicpublic void test11()employees.stream().filter(e)-e.getSalary()=5000).limit(2).forEach(System.out:println);可以看到,我们在代码中添加了 limit(2)来限制只获取两个员工信息。运行 test11 方法,输出如下的结果信息。Employee(name=张三,age=18,salary=9999.99)Employee(name=李四,age=38,salary=5555.55)使用 Lambda 表达式和 Stream API 也可以获取指定的字段信息,例如获取工资大于或者等于 5000 的员工姓名。第二章 Lambda 表达式 e.getSalary()=5000).map(Employee:getName).forEach(System.out:println);可以看到,使用 map 过滤出了工资大于或者等于 5000 的员工姓名。运行 test12 方法,输出如下的结果信息。张三李四王五赵六是不是很简单呢?最后,给出文中使用的设计模式:策略模式。2.5 匿名类到 Lambda 表达式我们先来看看从匿名类如何转换到 Lambda 表达式呢?这里,我们可以使用两个示例来说明如何从匿名内部类转换为 Lambda 表达式。匿名内部类到 Lambda 表达式使用匿名内部类如下所示。Runnable r=newnew Runnable()Overridepublicpublic void run()System.out.println(Hello Lambda);23第二章 Lambda 表达式转化为 Lambda 表达式如下所示。Runnable r=()-System.out.println(Hello Lambda);匿名内部类作为参数传递到 Lambda 表达式作为参数传递使用匿名内部类作为参数如下所示。TreeSet ts=newnew TreeSet(newnew Comparator()Overridepublicpublic int compare(Integer o1,Integer o2)returnreturn Ipare(o1,o2););使用 Lambda 表达式作为参数如下所示。TreeSet ts=newnew TreeSet(o1,o2)-Ipare(o1,o2););从直观上看,Lambda 表达式要比常规的语法简洁的多。2.6 Lambda 表达式的语法Lambda 表达式在 Java 语言中引入了“-”操作符,“-”操作符被称为 Lambda 表达式的操作符或者箭头操作符,它将 Lambda 表达式分为两部分:左侧部分指定了 Lambda 表达式需要的所有参数。第二章 Lambda 表达式 System.out.println(Hello Lambda);具体示例如下所示。Testpublicpublic void test1()Runnable r=()-System.out.println(Hello Lambda);newnew Thread(r).start();2.语法格式二:Lambda 表达式需要一个参数,并且无返回值Consumer func=(s)-System.out.println(s);具体示例如下所示。Testpublicpublic void test2()Consumer consumer=(x)-System.out.println(x);consumer.accept(Hello Lambda);25第二章 Lambda 表达式3.语法格式三:Lambda 只需要一个参数时,参数的小括号可以省略Consumer func=s-System.out.println(s);具体示例如下所示。Testpublicpublic void test3()Consumer consumer=x-System.out.println(x);consumer.accept(Hello Lambda);4.语法格式四:Lambda 需要两个参数,并且有返回值BinaryOperator bo=(a,b)-System.out.println(函数式接口);returnreturn a+b;具体示例如下所示。Testpublicpublic void test4()Comparator comparator=(x,y)-System.out.println(函数式接口);returnreturn Ipare(x,y);5.语法格式五:当 Lambda 体只有一条语句时,return 和大括号可以省略BinaryOperator bo=(a,b)-a+b;第二章 Lambda 表达式26具体示例如下所示。Testpublicpublic void test5()Comparator comparator=(x,y)-Ipare(x,y);6.语法格式六:Lambda 表达式的参数列表的数据类型可以省略不写,因为 JVM编译器能够通过上下文推断出数据类型,这就是“类型推断”BinaryOperator bo=(Integer a,Integer b)-returnreturn a+b;等同于:BinaryOperator bo=(a,b)-returnreturn a+b;上述 Lambda 表达式中的参数类型都是由编译器推断得出的。Lambda 表达式中无需指定类型,程序依然可以编译,这是因为 javac 根据程序的上下文,在后台推断出了参数的类型。Lambda 表达式的类型依赖于上下文环境,是由编译器推断出来的。这就是所谓的“类型推断”。2.7 函数式接口Lambda 表达式需要函数式接口的支持,所以,我们有必要来说说什么是函数式接口。只包含一个抽象方法的接口,称为函数式接口。27第二章 Lambda 表达式可以通过 Lambda 表达式来创建该接口的对象。(若 Lambda 表达式抛出一个受检异常,那么该异常需要在目标接口的抽象方法上进行声明)。可以在任意函数式接口上使用 FunctionalInterface 注解,这样做可以检查它是否是一个函数式接口,同时 javadoc 也会包含一条声明,说明这个接口是一个函数式接口。我们可以自定义函数式接口,并使用 Lambda 表达式来实现相应的功能。例如,使用函数式接口和 Lambda 表达式实现对字符串的处理功能。首先,我们定义一个函数式接口 MyFunc,如下所示。FunctionalInterfacepublicpublic interfaceinterface MyFunc publicpublic T getValue(T t);接下来,我们定义一个操作字符串的方法,其中参数为 MyFunc 接口实例和需要转换的字符串。publicpublic String handlerString(MyFunc myFunc,String str)returnreturn myFunc.getValue(str);接下来,我们对自定义的函数式接口进行测试,此时我们传递的函数式接口的参数为 Lambda表达式,并且将字符串转化为大写。Testpublicpublic void test6()String str=handlerString(s)-s.toUpperCase(),binghe);System.out.println(str);第二章 Lambda 表达式 s.substring(0,4),binghe);System.out.println(str);运行 test7 方法,得出的结果信息如下所示。bing可以看到,我们可以通过 handlerString(MyFunc myFunc,String str)方法结合Lambda 表达式对字符串进行任意操作。注意:作为参数传递 Lambda 表达式:为了将 Lambda 表达式作为参数传递,接收 Lambda 表达式的参数类型必须是与该 Lambda 表达式兼容的函数式接口的类型。2.8 Lambda 表达式典型案例2.8.1 案例一需求调用 Collections.sort()方法,通过定制排序比较两个 Employee(先比较年龄,年龄相同按姓名比较),使用 Lambda 表达式作为参数传递。29第二章 Lambda 表达式实现这里,我们先创建一个 Employee 类,为了满足需求,我们在 Employee 类中定义了姓名、年龄和工资三个字段,如下所示。DataBuilderToStringNoArgsConstructorAllArgsConstructorpublicpublic classclass Employee implementsimplements Serializable privateprivate static final long serialVersionUID=-9079722457749166858L;privateprivate String name;privateprivate Integer age;privateprivate Double salary;接下来,我们在 TestLambda 类中定义一个成员变量 employees,employees 变量是一个 List集合,存储了 Employee 的一个列表,如下所示。protectedprotected List employees=Arrays.asList(newnew Employee(张三,18,9999.99),newnew Employee(李四,38,5555.55),newnew Employee(王五,60,6666.66),newnew Employee(赵六,8,7777.77),newnew Employee(田七,58,3333.33);前期的准备工作完成了,接下来,我们就可以实现具体的业务逻辑了。第二章 Lambda 表达式 if if(e1.getAge()=e2.getAge()returnreturn e1.getName().compareTo(e2.getName();returnreturn Ipare(e1.getAge(),e2.getAge(););employees.stream().forEach(System.out:println);上述代码比较简单,我就不赘述具体逻辑了。运行 test1 方法,得出的结果信息如下所示。Employee(name=赵六,age=8,salary=7777.77)Employee(name=张三,age=18,salary=9999.99)Employee(name=李四,age=38,salary=5555.55)Employee(name=田七,age=58,salary=3333.33)Employee(name=王五,age=60,salary=6666.66)如果想倒叙输出如何处理呢,只需要在将 return Ipare(e1.getAge(),e2.getAge();修改成-return Ipare(e1.getAge(),e2.getAge();即可,如下所示。Testpublicpublic void test1()Collections.sort(employees,(e1,e2)-if if(e1.getAge()=e2.getAge()returnreturn e1.getName().compareTo(e2.getName();returnreturn-Ipare(e1.getAge(),e2.getAge(););employees.stream().forEach(System.out:println);再次运行 test1 方法,得出的结果信息如下所示。31第二章 Lambda 表达式Employee(name=王五,age=60,salary=6666.66)Employee(name=田七,age=58,salary=3333.33)Employee(name=李四,age=38,salary=5555.55)Employee(name=张三,age=18,salary=9999.99)Employee(name=赵六,age=8,salary=7777.77)结果符合我们的需求。2.8.2 案例二需求1.声明函数式接口,接口中声明抽象方法 public String getValue(String str);2.声明类 TestLambda,类中编写方法使用接口作为参数,将一个字符串转换为大写,并作为方法的返回值。3.再将一个字符串的第 2 个和第 4 个索引位置进行截取子串。实现首先,创建一个函数式接口 MyFunction,在 MyFunction 接口上加上注解FunctionalInterface 标识接口是一个函数式接口。如下所示。FunctionalInterfacepublicpublic interfaceinterface MyFunction publicpublic String getValue(String str);在 TestLambda 类中声明 stringHandler 方法,参数分别为待处理的字符串和函数式接口的实例,方法中的逻辑就是调用函数式接口的方法来处理字符串,如下所示。第二章 Lambda 表达式 s.toUpperCase();System.out.println(value);运行 test2 方法,得出如下的结果信息。BINGHE我们再来实现字符串截取的操作,如下所示。Testpublicpublic void test3()String value=stringHandler(binghe,(s)-s.substring(1,3);System.out.println(value);注意:需求中是按照第 2 个和第 4 个索引位置进行截取子串,字符串的下标是从 0 开始的,所以这里截取字符串时使用的是 substring(1,3),而不是 substring(2,4),这也是很多小伙伴容易犯的错误。另外,使用上述 Lambda 表达式形式,可以实现字符串的任意处理,并返回处理后的新字符串。运行 test3 方法,结果如下所示。33第二章 Lambda 表达式inin2.8.3 案例三需求1.声明一个带两个泛型的函数式接口,泛型类型为,其中,T 作为参数的类型,R 作为返回值的类型。2.接口中声明对象的抽象方法。3.在 TestLambda 类中声明方法。使用接口作为参数计算两个 long 型参数的和。4.再就按两个 long 型参数的乘积。实现首先,我们按照需求定义函数式接口 MyFunc,如下所示。FunctionalInterfacepublicpublic interfaceinterface MyFunc R getValue(T t1,T t2);接下来,我们在 TestLambda 类中创建一个处理两个 long 型数据的方法,如下所示。publicpublic void operate(Long num1,Long num2,MyFunc myFunc)System.out.println(myFunc.getValue(num1,num2);我们可以使用下面的方法来完成两个 long 型参数的和。第二章 Lambda 表达式 x+y);运
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 研究报告 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2026 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服