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;
}
}