Java8(1) :行为参数化

定义接口:

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]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值