前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >:: 双冒号是什么?

:: 双冒号是什么?

作者头像
索码理
发布2022-12-28 14:59:06
1.1K0
发布2022-12-28 14:59:06
举报
文章被收录于专栏:索码理索码理

:: 双冒号在工作中经常能碰到,但不一定能叫上名字,它在Java中有个专业名词叫方法引用(Method References)。那方法引用具体是什么呢?

方法引用是什么

方法引用是Java 8随着Lambda表达式引入的新特性,它是仅包含一个方法调用的Lambda表达式的简写语法。它的作用是「通过名称引用一个现有方法」。与Lambda表达式相比,它紧凑、易于阅读。

如果使用方法引用,方法体只能有一个简单语句

代码语言:javascript
复制
List<String> messages = Arrays.asList("hello", "suncodernote", "methodrefernce");
messages.forEach(s -> {
    System.out.println(s);
});

就像上面这段代码一样,方法体中只有一个System.out.println(s)语句。

用方法引用简化上面的代码:

代码语言:javascript
复制
messages.forEach(System.out::println);

方法引用的种类

方法引用有以下4种类型:

  • 静态方法引用
  • 特定对象的方法引用
  • 特定类的任意对象的方法引用
  • 构造方法引用

下面用举个例子来说明一下这4种方法引用。

静态方法引用

静态方法引用就是通过方法引用调用静态方法。

如果使用Lambda表达式引用静态方法,格式大概是这样的(args) -> Class.staticMethod(args)。

如果使用静态方法引用,格式是这样的Class::staticMethod。

举个例子:

先创建一个User实体类

代码语言:javascript
复制
@NoArgsConstructor
@AllArgsConstructor
@Data
public class User {

    private Integer age;

    /**
     * 比较年龄
     */
    public static int compareByAge(User a , User b){
        return a.getAge().compareTo(b.getAge());
    }

    /**
     * 创建对象
     */
    public static User createUser(Supplier<User> userSupplier){
        return userSupplier.get();
    }
}

测试类

代码语言:javascript
复制
public class MethodReferenceTest {
    public static void main(String[] args) {
        List<User> userList = new ArrayList<>();
        userList.add(new User(10));
        userList.add(new User(5));
        userList.add(new User(8));

        // 引用User静态方法compareByAge
        userList.sort(User::compareByAge);

        System.out.println(userList);
    }
}

输出结果:

代码语言:javascript
复制
[User(age=5), User(age=8), User(age=10)]

特定对象的方法引用

引用特定对象的实例方法。

如果使用Lambda表达式引用特定对象的方法,格式大概是这样的(args)->obj.instanceMethod(args)。

如果使用方法引用,格式是这样的obj::instanceMethod。

举个例子:

新建一个User类的比较器类UserComparator比较用户的年龄age

代码语言:javascript
复制
public class UserComparator implements Comparator<User> {

    @Override
    public int compare(User o1, User o2) {
        return o1.getAge().compareTo(o2.getAge());
    }
}

测试类

代码语言:javascript
复制
public class MethodReferenceTest {
    public static void main(String[] args) {
        List<User> userList = new ArrayList<>();
        userList.add(new User(10));
        userList.add(new User(5));
        userList.add(new User(8));

        UserComparator userComparator = new UserComparator();
        // 引用userComparator对象的compare方法
        Collections.sort(userList, userComparator::compare);
    }
}

特定类的任意对象的方法引用

对特定类型任意对象的实例方法的引用。

如果使用Lambda表达式引用特定类型任意对象的实例方法,格式大概是这样的(obj, args) -> obj.instanceMethod(args)。

如果使用方法引用,格式是这样的ObjectType::instanceMethod。

举个例子:

代码语言:javascript
复制
public class MethodReferenceTest {
    public static void main(String[] args) {
        List<String> messages = Arrays.asList("hello", "suncodernote", "methodrefernce");
        //引用String 类的实例方法compareToIgnoreCase
        Collections.sort(messages, String::compareToIgnoreCase);

        messages.forEach(System.out::println);
    }
}

构造方法引用

构造方法引用返回一个Supplier<T>对象,通过supplier.get()方法就可以获取到真正的对象。构造方法引用跟上面3个相比属于特例了,因为它没有直接调用已经存在的方法,而是跟了new关键字。

如果使用Lambda表达式引用构造方法,格式大概是这样的(args) -> new ClassName(args)。

如果使用方法引用,格式是这样的ClassName::new。

举个例子:

代码语言:javascript
复制
// 创建一个User类对象
User user = User.createUser(User::new);

列表总结一下4种方法引用的格式:

种类

语法

示例

静态方法引用

ContainingClass::staticMethodName

User::compareByAge

构造方法引用

ClassName::new

User::new

特定对象的方法引用

containingObject::instanceMethodName

userComparator::compare

特定类的任意对象的方法引用

ContainingType::methodName

String::compareToIgnoreCase

总结

方法引用是Java 8随着Lambda表达式引入的新特性,可能有些同学还不习惯这种编码方式,不过还好IDE可以提示我们简化或者通过IDE的功能直接转成Lambda和方法引用以简化代码。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-12-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 索码理 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 方法引用是什么
  • 方法引用的种类
    • 静态方法引用
      • 特定对象的方法引用
        • 特定类的任意对象的方法引用
          • 构造方法引用
          • 总结
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档