Lambda表达式、方法引用 实例

1、lambda表达式练习

(1)

package learn;

public interface Flyable {
    void fly(String s);
}
package learn;

public class FlyableDemo {
    public static void main(String[] args) {
        useFlyable(new Flyable() {
            @Override
            public void fly(String s) {
                System.out.println(s);
                System.out.println("飞机自驾游");
            }
        });//匿名内部类

        //Lambda表达式
        useFlyable(s -> {
            System.out.println(s);
            System.out.println("飞机自驾游");
        });
    }

    public static void useFlyable(Flyable f) {
        f.fly("风和日丽,晴空万里");
    }
}

(2)

package learn;

public interface Addable {
    int add(int x,int y);
}
package learn;

public class AddableDemo {
    public static void main(String[] args) {
        useAddable(new Addable() {
            @Override
            public int add(int x, int y) {
                return x+y;
            }
        });

        //Lambda表达式
        useAddable((x,y)-> x+y);
    }

    public static void useAddable(Addable a) {
        int sum=a.add(10,20);
        System.out.println(sum);
    }
}

2、接口组成更新:

若一个类同时实现了多个接口,且多个接口中的默认方法名相同。
此时必须进行方法重写
方法重写内容可以是:
(1)可选择保留其中的一个,通过 接口名.super.方法名 选择保留哪个接口的默认方法
(2)自己重写内容

package learn;

public interface Test1 {
    public default void show(){
        System.out.println("test");
    }
}

package learn;

public interface Test2 {
    public default void show(){
        System.out.println("test2");
    }
}

package learn;

public interface Test3 {
    public default void show(){
        System.out.println("test3");
    }
}
package learn;

public class Test implements Test1,Test2,Test3{

    @Override
    public void show() {
        Test2.super.show();
    }
}
package learn;

public class TestDemo {
    public static void main(String[] args) {
        Test td=new Test();
        td.show();
        //test2
    }
}

3、Lambda表达式支持的方法引用

常见引用方式:
(1)引用类方法:类名::静态方法

Lambda表达式被类方法替代的时候,它的形式参数全部传递给静态方法作为参数

package learn;

public interface Converter {
    int convert(String s);
}
package learn;

public class TestDemo {
    public static void main(String[] args) {
        useConverter(Integer::parseInt);
        useConverter(s -> Integer.parseInt(s));
    }

    public static void useConverter(Converter c) {
        int number=c.convert("666");
        System.out.println(number);
    }
}

(2)引用对象的实例方法:对象::成员方法

Lambda表达式被对象的实例方法替代的时候,它的形式参数全部传递给该方法作为参数

package learn;

public interface Printer {
    void printUpperCase(String s);
}
package learn;

public class PrintString {
    public void printUpper(String s){
        s=s.toUpperCase();
        System.out.println(s);
    }
}
package learn;

public class TestDemo {
    public static void main(String[] args) {
        usePrinter(new Printer() {
            @Override
            public void printUpperCase(String s) {
                PrintString ps=new PrintString();
                ps.printUpper(s);
            }
        });//匿名内部类

        usePrinter( s -> new PrintString().printUpper(s));//lambda表达式
        usePrinter(s -> s.toUpperCase());//lambda中指定的操作方案,在PrintString类中已经存在相同方案


        PrintString p=new PrintString();
        usePrinter(p::printUpper);

    }

    public static void usePrinter(Printer p) {
        p.printUpperCase("helloworld");
    }
}

(3)引用类的实例方法:类名::成员方法

Lambda表达式被类的实例方法替代的时候,第一个参数作为调用者,后面的参数全部传递给该方法作为参数

package learn;

public interface MyString {
    String mySubString(String s,int x,int y);
}

package learn;

public class TestDemo {
    public static void main(String[] args) {
        use(String::substring);
        use((s,x,y)->s.substring(x,y));
    }

    public static void use(MyString ms) {
        String res=ms.mySubString("HelloWorld",2,5);
        System.out.println(res);
    }
}

(4)引用构造器:类名::new

Lambda表达式被构造器替代的时候,它的形式参数全部传递给构造器作为参数

package learn;

public interface StudentBuilder {
    Student build(String name,int age);
}

package learn;

public class TestDemo {
    public static void main(String[] args) {
        //use((name, age) -> new Student(name,age));
        use(Student::new);
    }

    public static void use(StudentBuilder sb) {
        Student s=sb.build("林青霞",30);
        System.out.println(s.getName()+","+s.getAge());
    }
}
package learn;

public class Student {
    private String name;
    private int age;
    public Student(){

    }
    public Student(String name,int age){
        this.name=name;
        this.age=age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
lambda表达式可以用来创建匿函数,而特殊实例方法引用lambda表达式的一种特殊用法。特殊实例方法引用允许将已经存在的实例方法作为lambda表达式的实现。它的语法形式是 `ClassName::methodName`,其中ClassName是类,methodName是方法。 下面是一个具体的示例: ```java import java.util.function.Predicate; public class LambdaMethodReferenceExample { public static void main(String[] args) { String str = "hello"; // 使用lambda表达式 Predicate<String> lambdaPredicate = s -> str.startsWith(s); System.out.println(lambdaPredicate.test("he")); // 输出:true // 使用特殊实例方法引用 Predicate<String> methodReferencePredicate = str::startsWith; System.out.println(methodReferencePredicate.test("he")); // 输出:true } } ``` 在上面的示例中,我们使用了lambda表达式和特殊实例方法引用来创建一个Predicate(断言)对象。该断言对象用于判断给定的字符串是否以指定字符串开头。 在lambda表达式中,我们使用了`s -> str.startsWith(s)`来表示一个函数,其中`s`是传入的参数,`str.startsWith(s)`是函数的实现。 而在特殊实例方法引用中,我们使用了`str::startsWith`来表示函数的实现,它等价于`String::startsWith`,其中`str`是方法的调用者,`startsWith`是方法。 需要注意的是,特殊实例方法引用只能用于那些不接受任何参数的方法,或者第一个参数是调用者的方法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值