Java中 :: (方法引用)

:: 中被叫做 方法引用 可以进一步简化lambda的用法。


类名::静态方法    

public class Task {
    public static void main(String[] args) {
        String[] arr={"aaaa", "bbbb", "cccc"};
        List<String> stringList = Arrays.asList(arr);
        //引用静态方法 类名::静态方法名
        stringList.forEach(Task::print);
    }
    public static void print(String str){
        System.out.println(str);
    }
}

上面的代码和下面的lambda表达的意思一样

public class Task {
    public static void main(String[] args) {
        String[] arr={"aaaa", "bbbb", "cccc"};
        List<String> stringList = Arrays.asList(arr);
        //如下的lambda一样
        stringList.forEach((s -> Task.print(s)));

    }
    public static void print(String str){
        System.out.println(str);
    }
}

 执行的结果都一样


对象名::实例方法

public class Task {
    public static void main(String[] args) {
        String[] arr={"aaaa", "bbbb", "cccc"};
        List<String> stringList = Arrays.asList(arr);
        //引用实例方法  对象::方法名
        Task task = new Task();
        stringList.forEach(task::print);

    }
    public void print(String str){
        System.out.println(str);
    }
}

类名::实例方法

public class Task {
    public static void main(String[] args) {
        String[] name={"baby","jack","Mack","Andy","Test"};
        //引用实例方法  类名::实例方法
        Arrays.sort(name,String::compareToIgnoreCase);
        System.out.println(Arrays.toString(name));
    }
}


类名::new

@FunctionalInterface
interface CreateStudent{
     Student creatStudent(String name,int age);
}

public class Task {
    public static void main(String[] args) {
        //匿名内部类的方式
        test(new CreateStudent() {
            @Override
            public Student creatStudent(String name, int age) {
                return new Student(name,age);
            }
        });
        //使用lambda
        test(((name, age) -> new Student(name,age)));
        //这个是将lambda进行精简
        //引用构造方法  实体类::new
        test(Student::new);
    }
    public static void test(CreateStudent createStudent){
        Student test = createStudent.creatStudent("test", 12);
        System.out.println(test);
    }
}

 上面三种方法执行效果都是一样的,从上往下精简。

调用时候 必须是函数式接口

类名::get成员属性

//实体类:
@Data
public class Book {
    private Integer id;
    private String type;
    private String name;
}
//测试类
//实现功能:关键字查询
@Test
void testByLike(){
    String name = "Spring";
    LambdaQueryWrapper<Book> lambdaQueryWrapper = new LambdaQueryWrapper<Book>();
    lambdaQueryWrapper.like(name!=null,Book::getName,name);
    bookDao.selectList(lambdaQueryWrapper);
}

这里的用法是获取Book中name属性所对应的值

 

 super::实例方法

public class Task {
    public static void main(String[] args) {
        test test = new test();
        test.test();
    }
}
class  test extends ParentTest{
    public void test(){
        String[] str={"aaa","bbb","ccc"};
        List<String> stringList = Arrays.asList(str);
        stringList.forEach(super::print);
    }
}
class ParentTest{
    void print(String s){
        System.out.println(s);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值