java8 -- 方法引用

 

java8 新特新-- 方法引用

java8引入的方法引用:

分4种:

 *    1. 构造器引用              -- 类名::new
 *    2. 静态方法引用          -- 类名::方法名
 *    3. 普通方法引用          -- 实例名::方法名
 *    4.引用某个类型的任意对象的实例的普通方法     -- 类名::实例方法名   (比较难理解)其实就是3.普通方法引用

方法引用也是为了 简化代码的繁琐, 和Lambda表达式差不多,学了 Lambda方法引用就好理解多了

使用代码体现下:

      1  构造器引用  格式  类名::new

   创建函数接口

	/*
	 * 获取类的实例
	 */
	@FunctionalInterface
	interface function01<T>{
		 T getObject();
	}
	

 创建实体类

package com.xiaodu.java8.methodcite;

public class Person  {

	private String name;
	
	public Person(){
		this.name = "xiaoming";
	}

	@Override
	public String toString() {
		return "Person [name=" + name + "]";
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
	
	public void hello(String str){
		System.out.println("hello " + str);
	}

}

 测试构造器方法引用

	/**
	 * 构造器引用
	 * 	类名::new   (Person::new)
	 */
	@Test
	public void test01() {
//		使用构造器引用
		function01<Person> p = Person::new;	 
		Person pserson1 = p.getObject();
		System.out.println(pserson1);   //Person [name=xiaoming]
//		使用lambda表达式
		function01<Person> p2 = () -> new Person();
		Person person2 = p2.getObject();
		System.out.println(person2);    //Person [name=xiaoming]
		
	}

 2.静态方法引用    格式 类名::静态方法

扫描二维码关注公众号,回复: 12201675 查看本文章

     创建静态方法

	private static void printMess(String str){
		System.out.println("printMess  = " + str);
	}
	

创建 函数接口(函数接口也可以使用java8自带的,不用自己创建)

	@FunctionalInterface
	interface function02{
		void print(String s);
	}

 测试 静态方法引用

	/**
	 * 静态方法引用
	 * 	  类名::方法名
	 */
	@Test
	public void test02() {
//		静态方法引用
		function02 f1 = TestMethodCite::printMess;
		f1.print("xiaohong");  //printMess  = xiaohong
//		lambda
		function02 f2 = mess -> TestMethodCite.printMess(mess);;
		f2.print("xiaoming");   //printMess  = xiaoming
		
	}

 普通方法引用   格式: 对象实例::普通方法

    创建普通方法

	public int add(int a,int b) {
		return a+b;
	}

创建函数接口

	@FunctionalInterface
	interface function03{
		int operation(int a,int b);
	}

 使用普通方法引用

	
	/**
	 * 普通方法引用
	 */
	@Test
	public void test03() {
//		普通方法引用
		function03 f = new TestMethodCite() :: add;
		int operation = f.operation(12, 23);
		System.out.println(operation);  //35
//		lambda
		function03 f2 = (a,b) -> a+b;
		System.out.println(f2.operation(12, 12));  // 24
		
	}

 4 .  引用某个类型的任意对象的实例的普通方法,看起来和类名::静态方法一样,其实本质还是个 对象实例名::普通方法名

                格式  类名::普通方法名

/**
	 * 引用某个类型的任意对象的实例的普通方法
	 *   和类名:: 静态方法一样的格式
	 *   格式:
	 *     类名:: 普通方法
	 */
	@Test 
	public void test04() {
		/* public int compareToIgnoreCase(String str) 是String 的普通方法
		/  接受一个参数,而sort 的第二个参数为Comparator<? super T> c 类型		
		/  而comparator 是接受两个参数的函数接口  int compare(T o1, T o2);
		 * 总结:一个参数的方法,使用了两个参数的函数方法,不合理,原因是,在排序的时候,每个元素已经是对象了,
		 * 其实底层还是用的   类的实例::普通方法名 这样的模式  -- 也就是普通方法引用只是表面看起来像类名::静态方法这样的引用
		*/		
		Arrays.sort(new String[]{"asd","ddd"}, String::compareToIgnoreCase);
//		是用lambda 表达式 就可以看出来端倪了 
		Arrays.sort(new String[]{"asd","ddd"},(o1,o2) -> o1.compareToIgnoreCase(o2));
		
		/**
		 * 第二种分析,
		 */
//		创建一个 包含TestMethodCite 的集合
		List<TestMethodCite> asList = Arrays.asList(new TestMethodCite());
//		使用方法引用
		asList.forEach(TestMethodCite::str);
//		使用lambda   o 是从集合中取出来的 对象
		asList.forEach(o -> o.str());
		
	}

 

猜你喜欢

转载自blog.csdn.net/xiaodujava/article/details/84316759
今日推荐