java lambda的使用

lambda的使用

2014年Java8发布,开始支持lambda语法,无论是阅读还是手撸都是如此地简介明朗,令本猿不禁爱上了这门语法。自此,2015年发布的ECMAScript6也开启了对lambda的支持。

java的lambda语法通过函数式接口实现。

非常简单,我们先来手写一个函数式接口


/**
 * 函数式接口
 * 定义:
 * 		函数式接口只能有一个主方法
 * 		1.除equals(),toString()等通用方法外
 * 		2.除有方法体的方法外
 * 
 * 作用:
 * 		充当方法载体
 * 
 * 带方法体的方法:
 * 		1.重写主方法的方法
 * 		2.静态域方法
 */
@FunctionalInterface
interface FunctionMod<E> {
	E function(E first, E second);
	/**
	 * 重写主方法
	 */
	default FunctionMod<E> generate() {
        return (first, secon) -> {return first;};
    }
	/**
	 * 重写主方法
	 */
	default FunctionMod<E> generate2() {
        return (first, second) -> {return second;};
    }

	/**
	 * 静态域方法
	 */
	public static String test2(String str) {
		return 0 + str;
	}
	/**
	 * 继承的Object通用方法
	 */
	boolean equals(Object obj);

	/**
	 * 继承的Object通用方法
	 */
	String toString();
}

接下来去使用以上函数式接口


import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;


public class FunctionInterfaceE<T> {
	private T first;
	private T second;

	public FunctionInterfaceE() {
		super();
	}

	public FunctionInterfaceE(T first, T second) {
		super();
		this.first = first;
		this.second = second;
	}

	public FunctionInterfaceE(T first) {
		super();
		this.first = first;
	}

	public static void main(String[] args) {
		FunctionInterfaceE<String> functionInterface = new FunctionInterfaceE<String>("first", "second");
		Integer a = 1;
		//lambda 方法的编写/引用方法1
		String t1 = functionInterface.lambdaMed(FunctionInterfaceE::function);
		//lambda 方法的编写/引用方法2
		String t2 = functionInterface.lambdaMed((first, second) -> {
//			a = 2;	//不能直接改变父级方法中的变量,未经过参数传入的引用没有数据关联,很有可能被重排序,那么这样做就毫无意义了
			return first;});
		
		ArrayList<String> names = new ArrayList<String>();	names.add("first");
		//lambda 构造器的引用
		Stream<FunctionInterfaceE<String>> stream = names.stream().map(FunctionInterfaceE<String>::new);
		List<FunctionInterfaceE<String>> l = stream.collect(Collectors.toList());
		l.forEach(v -> System.out.println(v.first));
	}
	
	/**
	 * 将函数式接口(方法载体)至于参数中传入
	 */
	public T lambdaMed(FunctionMod<T> s) {
		s.generate().function(first, second);
		return s.function(first, second);
	}
	
	public static String function(String first, String second) {
		return first;
	}
}

以上就是lambda的全部使用方式

当然,为了将新语法和Java8之前的版本更好地融合,在各重要的类中还添加一些方法

代码:


import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.stream.Stream;

public class Lambda {
  public static void main(String[] args) {
    ArrayList<Person> javaProgrammers = new ArrayList<Person>() {  
        {  
          add(new Person("Elsdon", "Jaycob", "Java programmer", "male", 43, 2000));  
          add(new Person("Tamsen", "Brittany", "Java programmer", "female", 23, 1500));  
          add(new Person("Floyd", "Donny", "Java programmer", "male", 33, 1800));  
          add(new Person("Sindy", "Jonie", "Java programmer", "female", 32, 1600));  
          add(new Person("Vere", "Hervey", "Java programmer", "male", 22, 1200));  
          add(new Person("Maude", "Jaimie", "Java programmer", "female", 27, 1900));  
          add(new Person("Shawn", "Randall", "Java programmer", "male", 30, 2300));  
          add(new Person("Jayden", "Corrina", "Java programmer", "female", 35, 1700));  
          add(new Person("Palmer", "Dene", "Java programmer", "male", 33, 2000));  
          add(new Person("Addison", "Pam", "Java programmer", "female", 34, 1300));  
        }
      };
    System.out.println("--------- <<<<<<<<<javaProgrammers的排序>>>>>>>>>---------");
    javaProgrammers.sort((o1,o2)->o1.getFirstName().compareTo(o2.getFirstName()));
    javaProgrammers.sort((o1,o2)->o1.getSalary()-o2.getSalary());
    StringBuffer s = new StringBuffer();
    StringBuilder s2 = new StringBuilder();
    String s3 = new String();
    System.out.println("--------- <<<<<<<<<javaProgrammers的遍历>>>>>>>>>---------");
    javaProgrammers.forEach(progra -> System.out.println(progra.toString()));
    javaProgrammers.forEach(System.out::println);
//    try-catch-finally     注意throw Exception
//    javaProgrammers.forEach(progra -> Integer.parseInt(progra.getFirstName()));

    System.out.println("--------- <<<<<<<<<javaProgrammers通过Stream进行处理>>>>>>>>>---------");
    Stream<Person> arr = javaProgrammers
        .stream()
        .filter(per -> per.getSalary() > 1800)//过滤条件
        .limit(10);//保留0-N个单位
//  .max((o1,o2)-> o2.getSalary()-o1.getSalary());//最大值
//  .min((o1,o2)-> o1.getSalary()-o2.getSalary());//最小值 
    arr.forEach(proes -> System.out.printf("%s - %s | ",proes.getFirstName() ,proes.getSalary()));
    
    
    Map<String, Integer> items = new HashMap<>();
    items.put("A", 10);
    items.put("B", 20);
    items.put("C", 30);
    items.put("D", 40);
    items.put("E", 50);
    items.put("F", 60);
    items.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v));
    items.forEach((k,v)->{
        System.out.println("Item : " + k + " Count : " + v);
        if("E".equals(k)){
            System.out.println("Hello E");
        }
    });
  }
}

别忘了实体类


package com.td.lambda;

public class Person {

  private String firstName, lastName, job, gender;
  private int salary, age;

  public Person(String firstName, String lastName, String job, String gender, int age, int salary) {
    this.firstName = firstName;
    this.lastName = lastName;
    this.gender = gender;
    this.age = age;
    this.job = job;
    this.salary = salary;
  }

  public String getFirstName() {
    return firstName;
  }

  public void setFirstName(String firstName) {
    this.firstName = firstName;
  }

  public String getLastName() {
    return lastName;
  }

  public void setLastName(String lastName) {
    this.lastName = lastName;
  }

  public String getJob() {
    return job;
  }

  public void setJob(String job) {
    this.job = job;
  }

  public String getGender() {
    return gender;
  }

  public void setGender(String gender) {
    this.gender = gender;
  }

  public int getSalary() {
    return salary;
  }

  public void setSalary(int salary) {
    this.salary = salary;
  }

  public int getAge() {
    return age;
  }

  public void setAge(int age) {
    this.age = age;
  }
}


猜你喜欢

转载自blog.csdn.net/weixin_37481769/article/details/84258464
今日推荐