赞
踩
目录
(参数列表)->{}
():参数列表
->:连接符 连接的是参数以及方法体。
{}: 方法体。
- public class Test02 {
- public static void main(String[] args) {
-
- //匿名内部类的方式
- UserService userService=new UserService() {
- @Override
- public void show() {
- System.out.println("这是匿名内部类的show方法的实现");
- }
- };
- fun(userService);
-
- //使用lambda表达式--该接口必须为函数式接口
- fun(()->{
- System.out.println("这是lambda表达的show方法");
- });
- }
- public static void fun(UserService userService){
- userService.show();
- }
- }
- //函数式接口:里面有且仅有一个抽象方法。 ---只有这种接口才能使用lambda表达式
- interface UserService{
- public void show();
- }
- public class Test03 {
- public static void main(String[] args) {
- //创建一个ArrayList集合,其中存放了"Person"对象
- ArrayList<Person> list = new ArrayList<>();
- //向集合中添加元素-人物姓名和年龄
- list.add(new Person("张三", 19));
- list.add(new Person("李四", 8));
- list.add(new Person("王五", 20));
- list.add(new Person("赵六", 17));
- //按年龄从小到大排序
- System.out.println(list);
- //使用集合工具类"Collections"- 匿名内部类
- /*Collections.sort(list, new Comparator<Person>() {
- @Override
- public int compare(Person o1, Person o2) {
- return o1.getAge()-o2.getAge();
- }
- });*/
-
- //使用Lambda表达式
- Collections.sort(list, (o1, o2) -> {
- //这就是对函数式接口中抽象方法的简写
- return o1.getAge() - o2.getAge();
- });
- //输出按年龄从小到大排序的结果
- System.out.println(list);
- }
- }
-
- class Person {
- private String name;
- private Integer age;
- public Person() {
- }
- public Person(String name, Integer age) {
- this.name = name;
- this.age = age;
- }
-
- /**
- * 获取
- *
- * @return name
- */
- public String getName() {
- return name;
- }
-
- /**
- * 设置
- *
- * @param name
- */
- public void setName(String name) {
- this.name = name;
- }
-
- /**
- * 获取
- *
- * @return age
- */
- public Integer getAge() {
- return age;
- }
-
- /**
- * 设置
- *
- * @param age
- */
- public void setAge(Integer age) {
- this.age = age;
- }
-
- public String toString() {
- return "Person{name = " + name + ", age = " + age + "}";
- }
- }
在lambda表达式的标准写法基础上,可以使用省略写法的规则为:
小括号内的参数类型可以省略[]
如果小括号内有且仅有一个参数,则小括号可以省略
如果大括号内有且仅有一个语句,可以同时省略大括号,return 关键字及语句分号。
- public class Test04 {
- public static void main(String[] args) {
-
- fun((str)->
- str.toUpperCase()
- );
- }
- public static void fun(USB usb){
- String s = usb.toUpper("hello");
- System.out.println(s);
- }
- }
- interface USB{
- public String toUpper(String str);
- }
Lambda表达式的语法是非常简洁的,但是Lambda表达式不是随便使用的,使用时有几个条件要特别注意
方法的参数或局部变量类型必须为接口才能使用Lambda
接口中有且仅有一个抽象方法(@FunctionalInterface)
后面我们使用lambda表达式主要核心使用再Stream流中。
要想使用lambda表达式它的前提就是必须是函数式接口。
- public class Test {
- public static void main(String[] args) {
-
- fun(arr->{
- int sum = 0;
- for (int i : arr) {
- sum+=i;
- }
- return sum;
- });
- }
- public static void fun(Operation operation){
- int[] arr = {1,2,3,4,5};
- int sum = operation.getSum(arr);
- System.out.println("数组的和:"+sum);
- }
- }
- @FunctionalInterface
- interface Operation{
- public int getSum(int[] arr);
- }
分析:
我们知道使用Lambda表达式的前提是需要有函数式接口,而Lambda表达式使用时不关心接口名,抽象方法名。只关心抽象方法的参数列表和返回值类型。因此为了让我们使用Lambda表达式更加的方便,在JDK中提供了大量常用的函数式接口. 大多数无需自己再定义函数式接口,而可以直接使用jdk内置的函数式接口。分成四类。
适合有参数,但是没有返回值的。
- public class Test {
- public static void main(String[] args) {
- /*Consumer<Double> consumer = t->{
- System.out.println("今天坐车花费了" + t + "元");
- };*/
-
- fun(t->{
- System.out.println("今天坐车花费了" + t + "元");
- },200.00);
- }
- public static void fun(Consumer<Double> consumer,Double money){
- consumer.accept(money);
- }
- }
无参,需要返回值的接口类。
- public class Test01 {
- public static void main(String[] args) {
- fun(()->{
- return new Random().nextInt(10);
- });
- }
- public static void fun(Supplier<Integer> supplier){
- Integer i = supplier.get();
- System.out.println("结果:" + i);
- }
- }
T: 参数的泛型
R:返回值的泛型。
- public class Test01 {
- public static void main(String[] args) {
-
- fun2(t->t.toUpperCase(),"hello world");
-
- }
-
- public static void fun2(Function<String,String> function,String str){
- String apply = function.apply(str);
- System.out.println("结果:" + apply);
- }
-
-
- }
T: 参数
boolean:返回值类型。
- public class Test01 {
- public static void main(String[] args) {
-
- //Predicate断言型
- fun3(t->t>=18,18);
- }
- public static void fun3(Predicate<Integer> predicate,Integer age){
- boolean test = predicate.test(age);
- System.out.println("是否成年:"+test);
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。