Java8-11新特性总结(四)

1、方法引用

什么是方法引用?

方法引用指通过方法名指向一个方法。

为什么要使用方法引用?

方法引用可以使语言的构造更紧凑简洁,减少冗余代码。

怎么使用方法引用?

通过一对冒号"::"引用。

实例

  • 构造器引用

语法:Class::new或者Class<T>::new

public class Test {
	
	public static Test createInstance(final Supplier<Test> supplier) {
		return supplier.get();
	}
	
	public static void main(String[] args) {
		Test test = Test.createInstance(Test::new);
		System.out.println(test);
	}
}

@FunctionalInterface
interface Supplier<T> {

    T get();

}
  • 静态方法引用

语法:Class::staticMethod

public class Test {
	public static void main(String[] args) {
		ParseInterface parseInterface = Integer::parseInt;    //静态方法调用
		System.out.println(parseInterface.parse("10") + 5);    //15
	}
}

@FunctionalInterface
interface ParseInterface {

    int parse(String str);

}
  • 类对象方法引用

语法:Class::method

public class Test {
	
    public static Test create(final Supplier<Test> supplier) {
        return supplier.get();
    }

    public void myMethod() {
        System.out.println("myMethod");
    }

	public static void main(String[] args) {
		Test test01  = Test.create(Test::new);
		Test test02 = Test.create(Test::new);
		List<Test> tests = Arrays.asList(test01,test02);
		tests.forEach(Test::myMethod);    //实例方法调用
	}
}
  • 对象方法引用

语法:instance::method

public class Test {
	
    public static Test create(final Supplier<Test> supplier) {
        return supplier.get();
    }

    public void myMethod(final Test test) {
        System.out.println("myMethod");
    }
	
	public static void main(String[] args) {
		Test test01  = Test.create(Test::new);
		Test test02 = Test.create(Test::new);
		List<Test> tests = Arrays.asList(test01,test02);
		Test test = Test.create(Test::new);
		tests.forEach(test::myMethod);    //对象方法调用
	}
}

2、函数接口应用

目前列举几个java8新特性中较为常用的函数式接口:

接口名称方法声明功能说明
Consumervoid accept(T t)提供一个参数
SupplierT get()得到一个返回值
Function<T,R>R apply(T t)通过指定参数返回指定值
Predicateboolean test(T t)判断条件是否满足

实例:

Comsumer:

public class Test {
	
	public static void main(String[] args) {
		Consumer<Integer> consumer = (i) -> System.out.println(i);
		consumer.accept(10);
	}
}

Supplier:

public class Test {
	
	private static final DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
	
	public static void main(String[] args) {
		Supplier<LocalDateTime> supplier = () -> LocalDateTime.now();
		System.out.println(supplier.get());
		
		Supplier<String> supplier2 = () -> dtf.format(LocalDateTime.now());
		System.out.println(supplier2.get());
		
	}
}

Function<T,R>:

public class Test {
	
	public static void main(String[] args) {
		Function<Integer,Integer> function = (i) -> i*50;
		System.out.println(function.apply(10));
	}
}

Predicate:

public class Test {
	
	public static boolean check(int i,Predicate<Integer> predicate) {
		return predicate.test(i);
	}
	
	public static void main(String[] args) {
		System.out.println(Test.check(2,i -> i < 10));
	}
}

3、Java8的默认方法

Java8之前:接口不能有实现方法。

Java8之后:接口可以有带default关键字和static关键字的实现方法。

interface MyInterface{
	
	default void myMethod() {
		System.out.println("default方法实现");
	}
	
}

静态默认方法

interface MyInterface{
	
	static void myMethod() {
		System.out.println("静态默认方法实现");
	}
	
}

 

>>> Java8-11新特性总结(四)

>>> Java8-11新特性总结(五)

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值