java 8的方法引用_Java 8的方法引用

Java 8的方法引用是调用已有方法的Lambda表达式的简写形式,与Lambda表达式一样可作为函数式接口参数。

1.实例方法和静态方法

方法引用能作为哪种类型的函数式接口,要转化为Lambda表达式后看参数和返回值类型是否和函数式接口的抽象方法一致。

(1)t::instanceMethod等价于(x, y,...) -> t.instanceMethod(x, y,...)

(2)T::staticMethod等价于(x, y,...) -> T.staticMethod(x, y,...)

(3)T::instanceMethod等价于(x, y,...) -> x.instanceMethod(y,...)

2.构造器引用

构造器引用可作为Supplier, Function, BiFunction函数式接口,具体类型取决于上下文以及是否定义了对应类型的构造器。

(1)若定义了T(),则T::new等价于() -> new T(),可作为Supplier

(2)若定义了T(R),则T::new等价于r -> new T(r),可作为Function

(3)若定义了T(R, S),则T::new等价于(r, s) -> new T(r, s),可作为BiFunction

3.数组构造器引用

数组构造器引用可作为IntFunction或Function

T[]::new等价于n -> new T[n]

4.示例代码

import java.util.Arrays;

import java.util.function.BiFunction;

import java.util.function.BooleanSupplier;

import java.util.function.Function;

import java.util.function.IntFunction;

import java.util.function.IntSupplier;

import java.util.function.Predicate;

import java.util.function.Supplier;

import java.util.stream.Stream;

public class MethodReferenceDemo {

public static void main(String[] args) {

A a = new A(8);

B b = new B(-2, 2.5);

System.out.println("a = " + a);

System.out.println("b = " + b);

/*

a::getX等价于() -> a.getX()

是无参数、返回int的Lambda表达式

可作为IntSupplier或Supplier,不可作为Function

*/

System.out.println("a::getX");

supplier1(a::getX);

/*

A::getX等价于t -> t.getX()

是有一个A类型的参数、返回int的Lambda表达式

可作为ToIntFunction或Function

*/

System.out.println("A::getX");

function1(A::getX, a);

/*

a::isPositive等价于() -> a.isPositive()

是无参数、返回boolean的Lambda表达式

可作为BooleanSupplier或Supplier,不可作为Function或Predicate

*/

System.out.println("a::isPositive");

supplier2(a::isPositive);

/*

A::isPositive等价于t -> t.isPositive()

是有一个A类型的参数、返回boolean的Lambda表达式

可作为Function或Predicate

*/

System.out.println("A::isPositive");

function2(A::isPositive, a);

predicate(A::isPositive, b.getA());

/*

a::add等价于x -> a.add(x)

是有一个int类型的参数、返回A的Lambda表达式

可作为IntFunction或Function

*/

System.out.println("a::add");

function3(a::add, 10);

/*

A::add等价于(t, x) -> t.add(x)

是有一个A类型的参数和一个int类型的参数、返回A的Lambda表达式

可作为BiFunction

*/

System.out.println("A::add");

function4(A::add, b.getA(), 10);

/*

由于参数是Supplier且A定义了无参构造器

因此A::new等价于() -> new A(),对应A的无参构造器

*/

System.out.println("A::new");

supplier3(A::new);

/*

由于参数是IntFunction且A定义了构造器A(int)

因此A::new等价于x -> new A(x),对应A的构造器A(int)

*/

function3(A::new, 1);

/*

由于参数是BiFunction且B定义了构造器B(int, double)

因此B::new等价于(x, y) -> new B(x, y),对应B的构造器B(int, double)

*/

System.out.println("B::new");

function5(B::new, 25, 0.25);

// double[]::new等价于n -> new double[n]

System.out.println("double[]::new");

function6(double[]::new, 3);

stream();

}

public static void supplier1(IntSupplier supplier) {

System.out.printf("supplier.getAsInt()=%d\n", supplier.getAsInt());

}

public static void supplier2(BooleanSupplier supplier) {

System.out.printf("supplier.getAsBoolean()=%s\n", supplier.getAsBoolean());

}

public static void supplier3(Supplier supplier) {

System.out.printf("supplier.get()=%s\n", supplier.get());

}

public static void predicate(Predicate predicate, A a) {

System.out.printf("predicate.test(%s)=%s\n", a, predicate.test(a));

}

public static void function1(Function function, A a) {

System.out.printf("function.apply(%s)=%d\n", a, function.apply(a));

}

public static void function2(Function function, A a) {

System.out.printf("function.apply(%s)=%s\n", a, function.apply(a));

}

public static void function3(IntFunction function, int x) {

System.out.printf("function.apply(%d)=%s\n", x, function.apply(x));

}

public static void function4(BiFunction function, A a, int x) {

System.out.printf("function.apply(%s, %d)=%s\n", a, x, function.apply(a, x));

}

public static void function5(BiFunction function, int x, double y) {

System.out.printf("function.apply(%d, %f)=%s\n", x, y, function.apply(x, y));

}

public static void function6(IntFunction function, int x) {

System.out.printf("function.apply(%d)=%s\n", x, Arrays.toString(function.apply(x)));

}

public static void stream() {

A[] aArray = Stream.iterate(-5, x -> x + 1)

.limit(10)

.map(A::new)

.filter(A::isPositive)

.toArray(A[]::new);

System.out.printf("stream result: %s\n", Arrays.toString(aArray));

}

}

class A {

private int x;

public A() {

x = 0;

}

public A(int x) {

this.x = x;

}

public int getX() {

return x;

}

public boolean isPositive() {

return x > 0;

}

public A add(int x) {

return new A(this.x + x);

}

@Override

public String toString() {

return "A{" +

"x=" + x +

'}';

}

}

class B {

private A a;

private double y;

public B() {

a = new A();

}

public B(int x, double y) {

a = new A(x);

this.y = y;

}

public A getA() {

return a;

}

public double getY() {

return y;

}

@Override

public String toString() {

return "B{" +

"a=" + a +

", y=" + y +

'}';

}

}

运行结果

a = A{x=8}

b = B{a=A{x=-2}, y=2.5}

a::getX

supplier.getAsInt()=8

A::getX

function.apply(A{x=8})=8

a::isPositive

supplier.getAsBoolean()=true

A::isPositive

function.apply(A{x=8})=true

predicate.test(A{x=-2})=false

a::add

function.apply(10)=A{x=18}

A::add

function.apply(A{x=-2}, 10)=A{x=8}

A::new

supplier.get()=A{x=0}

function.apply(1)=A{x=1}

B::new

function.apply(25, 0.250000)=B{a=A{x=25}, y=0.25}

double[]::new

function.apply(3)=[0.0, 0.0, 0.0]

stream result: [A{x=1}, A{x=2}, A{x=3}, A{x=4}]

标签:function,Java,System,引用,apply,new,方法,public,out

来源: https://blog.csdn.net/zzy979481894/article/details/100056898

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值