Java方法引用与构造器引用

  •  

  • 概念

  • 情况一:对象 :: 实例方法

  • //Consumer中的void accept(T t)
    //PrintStream中的void println(T t)
    //Supplier中的T get()
    //Employee中的String getName()

     

    
    public class Employee {
    
    	private int id;
    	private String name;
    	private int age;
    	private double salary;
    
    	public int getId() {
    		return id;
    	}
    
    	public void setId(int id) {
    		this.id = id;
    	}
    
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public int getAge() {
    		return age;
    	}
    
    	public void setAge(int age) {
    		this.age = age;
    	}
    
    	public double getSalary() {
    		return salary;
    	}
    
    	public void setSalary(double salary) {
    		this.salary = salary;
    	}
    
    	public Employee() {
    		System.out.println("Employee().....");
    	}
    
    	public Employee(int id) {
    		this.id = id;
    		System.out.println("Employee(int id).....");
    	}
    
    	public Employee(int id, String name) {
    		this.id = id;
    		this.name = name;
    	}
    
    	public Employee(int id, String name, int age, double salary) {
    
    		this.id = id;
    		this.name = name;
    		this.age = age;
    		this.salary = salary;
    	}
    
    	@Override
    	public String toString() {
    		return "Employee{" + "id=" + id + ", name='" + name + '\'' + ", age=" + age + ", salary=" + salary + '}';
    	}
    
    	@Override
    	public boolean equals(Object o) {
    		if (this == o)
    			return true;
    		if (o == null || getClass() != o.getClass())
    			return false;
    
    		Employee employee = (Employee) o;
    
    		if (id != employee.id)
    			return false;
    		if (age != employee.age)
    			return false;
    		if (Double.compare(employee.salary, salary) != 0)
    			return false;
    		return name != null ? name.equals(employee.name) : employee.name == null;
    	}
    
    	@Override
    	public int hashCode() {
    		int result;
    		long temp;
    		result = id;
    		result = 31 * result + (name != null ? name.hashCode() : 0);
    		result = 31 * result + age;
    		temp = Double.doubleToLongBits(salary);
    		result = 31 * result + (int) (temp ^ (temp >>> 32));
    		return result;
    	}
    
    
    	public String getName(Employee employee) {
    		return  name;
    	}
    }
    

     

  • @Test
    	public void test1() {
    		Consumer<String> con1 = str -> System.out.println(str);
    		con1.accept("北京");
    		System.out.println("*******************");
    		PrintStream ps = System.out;
    
    		Consumer<String> con2 = ps::println;
    		con2.accept("beijing");
    
    		Consumer<String> con3=System.out::println;
    		con3.accept("长沙");
    	}
    @Test
    	public void test2() {
    		Employee emp = new Employee(1001,"Tom",23,5600);
    
    		Supplier<String> sup1 = () -> emp.getName();
    		System.out.println(sup1.get());
    		System.out.println("*******************");
    		Supplier<String> sup2 = emp::getName;
    		System.out.println(sup2.get());
    
    	}

    情况二:类 :: 静态方法

  • //Comparator中的int compare(T t1,T t2)
    //Integer中的int compare(T t1,T t2)
  • @Test
    	public void test3() {
    		Comparator<Integer> com1 = (t1,t2) -> Integer.compare(t1,t2);
    		System.out.println(com1.compare(12,21));
    
    		System.out.println("*******************");
    
    		Comparator<Integer> com2 = Integer::compare;
    		System.out.println(com2.compare(12,3));
    
    	}
    
    	//Function中的R apply(T t)
    	//Math中的Long round(Double d)
    	@Test
    	public void test4() {
    		Function<Double,Long> func = new Function<Double, Long>() {
    			@Override
    			public Long apply(Double d) {
    				return Math.round(d);
    			}
    		};
    
    		System.out.println("*******************");
    
    		Function<Double,Long> func1 = d -> Math.round(d);
    		System.out.println(func1.apply(12.3));
    
    		System.out.println("*******************");
    
    		Function<Double,Long> func2 = Math::round;
    		System.out.println(func2.apply(12.6));
    		System.out.println("***********");
    
    		Function<Double,Long> func3=Math::round;
    		System.out.println(func3.apply(13.89));
    
    	}
    
    	//Function中的R apply(T t)
    	//Math中的Long round(Double d)
    	@Test
    	public void test4() {
    		Function<Double,Long> func = new Function<Double, Long>() {
    			@Override
    			public Long apply(Double d) {
    				return Math.round(d);
    			}
    		};
    
    		System.out.println("*******************");
    
    		Function<Double,Long> func1 = d -> Math.round(d);
    		System.out.println(func1.apply(12.3));
    
    		System.out.println("*******************");
    
    		Function<Double,Long> func2 = Math::round;
    		System.out.println(func2.apply(12.6));
    		System.out.println("***********");
    
    		Function<Double,Long> func3=Math::round;
    		System.out.println(func3.apply(13.89));
    
    	}

    情况三:类 :: 实例方法  (有难度)

// Comparator中的int comapre(T t1,T t2)
	// String中的int t1.compareTo(t2)
	@Test
	public void test5() {
		Comparator<String> com1 = (s1,s2) -> s1.compareTo(s2);
		System.out.println(com1.compare("abc","abd"));

		System.out.println("*******************");

		Comparator<String> com2 = String :: compareTo;
		System.out.println(com2.compare("abd","abm"));

		System.out.println("******************");
		Comparator<Integer> com3=Integer::compareTo;
		System.out.println(com3.compare(18,19));
	}
@Test
	public void test6() {
		BiPredicate<String,String> pre1 = (s1,s2) -> s1.equals(s2);
		System.out.println(pre1.test("abc","abc"));

		System.out.println("*******************");
		BiPredicate<String,String> pre2 = String :: equals;
		System.out.println(pre2.test("abc","abd"));
		System.out.println("************");

		BiPredicate<Integer,Integer> pre3=Integer::equals;
		System.out.println(pre3.test(19,19));
	}
// Function中的R apply(T t)
// Employee中的String getName();
@Test
public void test7() {
   Employee employee = new Employee(1001, "Jerry", 23, 6000);


   Function<Employee,String> func1 = e -> e.getName();
   System.out.println(func1.apply(employee));
   System.out.println("*******************");

   Function<Employee,String> func2 =Employee::getName;
   System.out.println(func2.apply(employee));
   System.out.println("**********");

   Employee tom = new Employee(1002, "Tom", 32, 8000);
   System.out.println(func2.apply(tom));

}

构造器的引用

**
 * 一、构造器引用
 *      和方法引用类似,函数式接口的抽象方法的形参列表和构造器的形参列表一致。
 *      抽象方法的返回值类型即为构造器所属的类的类型
 *
 * 二、数组引用
 *     大家可以把数组看做是一个特殊的类,则写法与构造器引用一致。
 *
@Test
    public void test1(){

        Supplier<Employee> sup = new Supplier<Employee>() {
            @Override
            public Employee get() {
                return new Employee();
            }
        };
        System.out.println("*******************");

        Supplier<Employee>  sup1 = () -> new Employee();
        System.out.println(sup1.get());

        System.out.println("*******************");

        Supplier<Employee>  sup2 = Employee :: new;
        System.out.println(sup2.get());
    }

	//Function中的R apply(T t)
    @Test
    public void test2(){
        Function<Integer,Employee> func1 = id -> new Employee(id);
        Employee employee = func1.apply(1001);
        System.out.println(employee);

        System.out.println("*******************");

        Function<Integer,Employee> func2 = Employee :: new;
        Employee employee1 = func2.apply(1002);
        System.out.println(employee1);
    }

	//BiFunction中的R apply(T t,U u)
    @Test
    public void test3(){
        BiFunction<Integer,String,Employee> func1 = (id,name) -> new Employee(id,name);
        System.out.println(func1.apply(1001,"Tom"));

        System.out.println("*******************");

        BiFunction<Integer,String,Employee> func2 = Employee :: new;
        System.out.println(func2.apply(1002,"Tom"));
        new BiFunction<Integer, String, Employee>() {
            @Override
            public Employee apply(Integer integer, String s) {
                return null;
            }
        };
    }

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值