定义接口:
package com.tony.app;
public interface PersonPredicate {
boolean test(Person person);
// boolean test(T template);
}
实现类:
package com.tony.app;
public class PersonByName implements PersonPredicate {
@Override
public boolean test(Person person) {
return person.getName().contains("n");
}
}
package com.tony.app;
public class PersonByNameAndAge implements PersonPredicate {
@Override
public boolean test(Person person) {
return person.getName().contains("n") && person.getAge() > 100 ;
}
}
package com.tony.app;
import java.util.HashSet;
import java.util.Set;
public class Java8Demo {
public static void main(String[] args) {
Person p1 = new Person("tony", 8);
Person p2 = new Person("文心", 88);
Person p3 = new Person("sunhaifeng", 888);
Set<Person> person = new HashSet<>();
person.add(p1);
person.add(p2);
person.add(p3);
System.out.println(person);
// 需求1:名字中包含字母n的有哪些
// 常规解决思路
Set<Person> sets_name = filterPersonByName(person);
System.out.println(sets_name);
// 需求2:名字中包含字母n,年龄大于100的有哪些
Set<Person> sets_name_age = filterPersonByNameAndAge(person);
System.out.println(sets_name_age);
// 需求...(太多)
System.out.println("===行为参数化===");
// 行为参数化
// 定义接口 创建类实现接口
Set<Person> sets_name_predicate = filterPerson(person, new PersonByName());
System.out.println(sets_name_predicate);
Set<Person> sets_name_age_predicate = filterPerson(person, new PersonByNameAndAge());
System.out.println(sets_name_age_predicate);
System.out.println("===行为参数化 匿名类===");
// 定义接口 匿名类实现接口
Set<Person> sets_name_predicate_anonymous = filterPerson(person, new PersonPredicate() {
@Override
public boolean test(Person person) {
return person.getName().contains("n");
}
});
System.out.println(sets_name_predicate_anonymous);
Set<Person> sets_name_age_predicate_anonymous = filterPerson(person, new PersonPredicate() {
@Override
public boolean test(Person person) {
return person.getName().contains("n") && person.getAge() > 100;
}
});
System.out.println(sets_name_age_predicate_anonymous);
System.out.println("===行为参数化 Lambda表达式===");
// 定义接口 Lambda表达式
Set<Person> sets_name_predicate_lambda = filterPerson(person, (Person p) -> p.getName().contains("n"));
System.out.println(sets_name_predicate_lambda);
Set<Person> sets_name_age_predicate_lambda = filterPerson(person,
(Person p) -> p.getName().contains("n") && p.getAge() > 100);
System.out.println(sets_name_age_predicate_lambda);
// 现在在PersonPredicate接口中只能对Person进行筛选 如果要筛选别的类型呢 继续抽象化
}
private static Set<Person> filterPerson(Set<Person> person, PersonPredicate personPredicate) {
Set<Person> selected_person = new HashSet<>();
person.forEach(one_person -> {
if (personPredicate.test(one_person)) {
selected_person.add(one_person);
}
});
return selected_person;
}
private static Set<Person> filterPersonByNameAndAge(Set<Person> person) {
Set<Person> selected_person = new HashSet<>();
person.forEach(one_person -> {
if (one_person.getName().contains("n") && one_person.getAge() > 100) {
selected_person.add(one_person);
}
});
return selected_person;
}
private static Set<Person> filterPersonByName(Set<Person> person) {
Set<Person> selected_person = new HashSet<>();
person.forEach(one_person -> {
if (one_person.getName().contains("n")) {
selected_person.add(one_person);
}
});
return selected_person;
}
}
// 现在在PersonPredicate接口中只能对Person进行筛选 如果要筛选别的类型呢 继续抽象化(使用泛型) 修改接口
package com.tony.app;
public interface PersonPredicate<T> {
boolean test(T template);
}
package com.tony.app;
import java.util.HashSet;
import java.util.Set;
public class Java8Demo {
public static void main(String[] args) {
Person p1 = new Person("tony", 8);
Person p2 = new Person("文心", 88);
Person p3 = new Person("sunhaifeng", 888);
Set<Person> person = new HashSet<>();
person.add(p1);
person.add(p2);
person.add(p3);
System.out.println(person);
// 需求1:名字中包含字母n的有哪些
// 常规解决思路
Set<Person> sets_name = filterPersonByName(person);
System.out.println(sets_name);
// 需求2:名字中包含字母n,年龄大于100的有哪些
Set<Person> sets_name_age = filterPersonByNameAndAge(person);
System.out.println(sets_name_age);
// 需求...(太多)
System.out.println("===行为参数化===");
// 行为参数化
// 定义接口 创建类实现接口
Set<Person> sets_name_predicate = filterPerson(person, new PersonByName());
System.out.println(sets_name_predicate);
Set<Person> sets_name_age_predicate = filterPerson(person, new PersonByNameAndAge());
System.out.println(sets_name_age_predicate);
System.out.println("===行为参数化 匿名类===");
// 定义接口 匿名类实现接口
Set<Person> sets_name_predicate_anonymous = filterPerson(person, new PersonPredicate<Person>() {
@Override
public boolean test(Person person) {
return person.getName().contains("n");
}
});
System.out.println(sets_name_predicate_anonymous);
Set<Person> sets_name_age_predicate_anonymous = filterPerson(person, new PersonPredicate<Person>() {
@Override
public boolean test(Person person) {
return person.getName().contains("n") && person.getAge() > 100;
}
});
System.out.println(sets_name_age_predicate_anonymous);
System.out.println("===行为参数化 Lambda表达式===");
// 定义接口 Lambda表达式
Set<Person> sets_name_predicate_lambda = filterPerson(person, (Person p) -> p.getName().contains("n"));
System.out.println(sets_name_predicate_lambda);
Set<Person> sets_name_age_predicate_lambda = filterPerson(person,
(Person p) -> p.getName().contains("n") && p.getAge() > 100);
System.out.println(sets_name_age_predicate_lambda);
// 现在在PersonPredicate接口中只能对Person进行筛选 如果要筛选别的类型呢 继续抽象化 修改接口
System.out.println("String类型测试");
// String 类型进行测试
Set<String> strs = new HashSet<>();
strs.add("tony");
strs.add("文心");
strs.add("sunhaifeng");
Set<String> set_str = filterPerson(strs,(String str)->str.contains("n"));
System.out.println(set_str);
}
private static <T> Set<T> filterPerson(Set<T> person, PersonPredicate<T> personPredicate) {
Set<T> selected_person = new HashSet<>();
person.forEach(one_person -> {
if (personPredicate.test( one_person)) {
selected_person.add(one_person);
}
});
return selected_person;
}
private static Set<Person> filterPersonByNameAndAge(Set<Person> person) {
Set<Person> selected_person = new HashSet<>();
person.forEach(one_person -> {
if (one_person.getName().contains("n") && one_person.getAge() > 100) {
selected_person.add(one_person);
}
});
return selected_person;
}
private static Set<Person> filterPersonByName(Set<Person> person) {
Set<Person> selected_person = new HashSet<>();
person.forEach(one_person -> {
if (one_person.getName().contains("n")) {
selected_person.add(one_person);
}
});
return selected_person;
}
}
输出结果:
[Person [name=文心, age=88], Person [name=sunhaifeng, age=888], Person [name=tony, age=8]]
[Person [name=sunhaifeng, age=888], Person [name=tony, age=8]]
[Person [name=sunhaifeng, age=888]]
===行为参数化===
[Person [name=sunhaifeng, age=888], Person [name=tony, age=8]]
[Person [name=sunhaifeng, age=888]]
===行为参数化 匿名类===
[Person [name=sunhaifeng, age=888], Person [name=tony, age=8]]
[Person [name=sunhaifeng, age=888]]
===行为参数化 Lambda表达式===
[Person [name=sunhaifeng, age=888], Person [name=tony, age=8]]
[Person [name=sunhaifeng, age=888]]
String类型测试
[tony, sunhaifeng]