Java 8双冒号::方法引用操作符

Java 8中,双冒号::称为方法引用操作符,我们可以使用它来引用类的方法。

::引用类的方法,返回一个函数接口(function interface),这等同于lambda表达式,但与lambda表达式不同的是,lambda表达式需要自定义一个lambda body,而::引用的是一个方法。

简单地说函数接口,就是只拥有一个抽象方法的接口,如Runnable。

::引用方法返回的函数接口不指定是什么特定的函数接口,但用于接收::方法引用返回的函数接口需要与方法有一致的签名,也就是它所接收的参数和返回值应该和方法定义的是一致的。

class MyMath{
     public double square(double num){
        return Math.pow(num , 2);
    }
}

MyMath myMath = new MyMath();
Function<Double, Double> square = myMath::square;
double ans = square.apply(23.0);

其中Function只有一个方法apply,apply接收一个参数并返回一个值。

::方法引用有以下几种用法

引用静态方法

格式:
ClassName::method

class MyMath{
    public static double square(double num){
        return Math.pow(num , 2);
    }
}

Function<Double, Double> square = MyMath::square;
double ans = square.apply(23.0);

引用实例方法

格式:
instanceRef::methName

Set<String> set = new HashSet<>();
set.addAll(Arrays.asList("one","two","three"));
Predicate<String> pred = set::contains;
boolean exists = pred.test("one");

引用某一类型任意实例的方法

格式:
ClassName::methodName

List<User> users = new ArrayList<>();
Map<Integer, String> userMap = users.stream().collect(Collectors.toMap(User::getId,User::getName));

引用构造函数

引用构造函数ClassName::new

class Data<T>{
    T data;
}

Supplier<Data<String>> dataRef = Data<String>::new;
Data<String> Data = dataRef.get();

其中Supplier的get方法不接收参数,并返回一个值。

引用构造函数创建数组

创建数组 ClassName[]::new

版权声明:著作权归作者所有。

相关推荐

Java 8使用Collectors.partitioningBy分割列表

有这样一个集合:List<Integer> integers = [ 1,2,3,4,5,6,7,8,9] 现在需要把集合按奇偶数分割为两个列表。这种情况下,我们可以使用Collectors.partitioningBy来分割:Map<Boolean, List<Integer>> map =

Java 8使用parallel Stream测试StringBuilder线程安全

我们知道StringBuilder不是线程安全的,但如何证明它非线程安全呢?测试StringBuilder是否线程安全一个简单的思路如下:模拟多个线程并发向StringBuilder实例添加字符,最后检测builder.toString().length()的值是否为添加字符的次数,如果非线程安全会出现builder.toString().length()的值与添加字符的次数不一致。Java&nb

Python避免使用“is”操作符比较integer数据

Python的is操作符实际上是比较的是对象的id值,id(obj)。a is b 实际可以理解为id(a) == id(b) Python里保存了一个整型数组作为缓存,范围为-5到256,如果使用此范围的数据赋值,那么实际使用引用此数组的数据,所以获取这些范围数据的id值,同一个数是相同的。Python3.6>>>a=-5 >>

Java 8 Stream API转换到Kotlin集合API

Kotlin提供的集合操作的API相对Java 8 Stream的API简洁很多。下面是Java 8 Stream API转换到Kotlin集合API。 映射属性聚合为列表// Java:   List<String> names = users.stream().m