java.util.function中的常用接口
- Predicate – 传入一个参数,返回一个bool结果, 方法为boolean test(T t)
- Consumer – 传入一个参数,无返回值,纯消费。 方法为void accept(T t)
- Function – 传入一个参数,返回一个结果,方法为R apply(T t)
- Supplier – 无参数传入,返回一个结果,方法为T get()
- UnaryOperator – 一元操作符, 继承Function,传入参数的类型和返回类型相同。
- BinaryOperator – 二元操作符, 传入的两个参数的类型和返回类型相同, 继承BiFunction
一个经得起折腾的实体类
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
调用类
public class FunctionApp {
public static void main(String[] args) {
PersonFactory<Person> personPersonFactory = Person::new;
Person jack = personPersonFactory.create("jack", 30);
Person tom = personPersonFactory.create("tom", 20);
Predicate<Person> personAgePredicate = person -> person.getAge() > 25;
Consumer<Person> personConsumer = person -> person.setName("Big " + person.getName());
Function<Person, Person> transformNameByAge = person -> {
if (personAgePredicate.test(person)) {
personConsumer.accept(person);
}
return person;
};
Consumer<Object> print = FunctionApp::showString;
print.accept(transformNameByAge.apply(jack));
print.accept(transformNameByAge.apply(tom));
}
public static void showString(Object object) {
System.out.println(object.toString());
}
}
结果
Person{name='Big jack', age=30}
Person{name='tom', age=20}
Amazing!! factory-kit
这是一个简单工厂的实现,应用jdk8的一些语法只能用惊艳形容,其中WeaponFactory
接口中的静态方法为什么能返回一个return name -> map.get(name).get();
,困扰我很久,回头写线程代码时,突然意识到这部分可以转换为:
return new WeaponFactory() {
@Override
public Weapon create(WeaponType name) {
return map.get(name).get();
}
};
一个匿名类。
为了结构更加整洁Builder
这个接口也被抽象出来,每次调用时会应用到Map<WeaponType, Supplier