ClassName::methodName 是一个方法引用(Method Reference)的表示形式 主要用于简化Lambda表达式

在Java中,ClassName::methodName 是一个方法引用(Method Reference)的表示形式。这是Java 8引入的一个新特性,主要用于简化Lambda表达式。它允许你更简洁、更易读的方式引用一个已存在的方法。
方法引用分为以下几种类型:

1.静态方法引用:ClassName::staticMethodName
2.某个对象的实例方法引用:instance::instanceMethodName
3.类的任意对象的实例方法引用:ClassName::instanceMethodName
4.构造函数引用:ClassName::new

工作原理
当你有一个函数式接口,并且你需要使用一个已经存在的方法来实现这个接口的时候,你可以使用方法引用。
例如,考虑以下函数式接口:
@FunctionalInterface
interface Converter {
    int convert(String s);
}

假设你有一个静态方法:
public class StringConverter {
    public static int stringToInt(String s) {
        return Integer.parseInt(s);
    }
}

使用Lambda表达式,你可以这样实现Converter接口:

Converter myConverter = (s) -> StringConverter.stringToInt(s);
 

使用方法引用,你可以更简洁地写:
Converter myConverter = StringConverter::stringToInt;

当你调用 myConverter.convert("123") 的时候,它实际上调用的是 StringConverter.stringToInt("123")。
这样做的好处是,代码更简洁,可读性也更强。
示例
静态方法引用

public class Test {
    public static void printSomething(String something) {
        System.out.println(something);
    }

    public static void main(String[] args) {
        List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
        list.forEach(Test::printSomething);  // 使用静态方法引用
    }
}
 

某个对象的实例方法引用

public class Printer {
    public void printSomething(String something) {
        System.out.println(something);
    }

    public static void main(String[] args) {
        Printer printer = new Printer();
        List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
        list.forEach(printer::printSomething);  // 使用实例方法引用
    }
}
 

类的任意对象的实例方法引用
public class Test {
    public static void main(String[] args) {
        List<String> list = Arrays.asList("Apple", "Banana", "Cherry");
        list.forEach(String::toUpperCase);  // 使用任意对象的实例方法引用
    }
}
 

构造函数引用

@FunctionalInterface
interface Factory<T> {
    T create();
}

class MyClass {
    MyClass() {
        System.out.println("MyClass Constructor Called");
    }

    public static void main(String[] args) {
        Factory<MyClass> factory = MyClass::new;  // 使用构造函数引用
        MyClass myClass = factory.create();
    }
}
 

  • 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、付费专栏及课程。

余额充值