Lambda表达式
准备对象
@Data
public class Person {
public enum Sex {
MALE, FEMALE
}
private String name;
private LocalDate birthday;
private Sex gender;
private String emailAddress;
private Integer age;
public void printPerson() {
System.out.println(this.name);
}
public void printAge(){
System.out.println(this.age);
}
public Person(String name, LocalDate birthday, Sex gender, String emailAddress, Integer age) {
this.name = name;
this.birthday = birthday;
this.gender = gender;
this.emailAddress = emailAddress;
this.age = age;
}
}
方法接口
1、Predicate<T>
官方提供的一个基础接口,返回类型为布尔类型
@FunctionalInterface
public interface Predicate<T> {
boolean test(T t);
default Predicate<T> and(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) && other.test(t);
}
default Predicate<T> negate() {
return (t) -> !test(t);
}
default Predicate<T> or(Predicate<? super T> other) {
Objects.requireNonNull(other);
return (t) -> test(t) || other.test(t);
}
static <T> Predicate<T> isEqual(Object targetRef) {
return (null == targetRef)
? Objects::isNull
: object -> targetRef.equals(object);
}
- Predicate.test()
public static void printPersons(List<Person> roster, Predicate<Person> tester) {
for (Person p : roster) {
if (tester.test(p)) {
p.printPerson();
}
}
}
找出对应年龄段的人
public static void main(String[] args) {
Person person1 = new Person("张三", LocalDate.now(), Person.Sex.FEMALE,"1",18);
Person person2 = new Person("李四",LocalDate.now(), Person.Sex.MALE,"2",24);
Person person3 = new Person("王五",LocalDate.now(),Person.Sex.FEMALE,"3",30);
Person person4 = new Person("赵六",LocalDate.now(), Person.Sex.MALE,"4",36);
List list = new ArrayList();
list.addAll(Arrays.asList(person1,person2,person3,person4));
printPersons(list,p->p.getAge()>18 && p.getAge()<36);
}
输出结果
李四
王五
- Predicate.and()
public static void printPersons(List<Person> roster, Predicate<Person> tester,Predicate<Person> tester2) {
for (Person p : roster) {
if (tester.and(tester2).test(p)) {
p.printPerson();
}
}
}
找出同时满足连个条件的
public static void main(String[] args) {
Person person1 = new Person("张三", LocalDate.now(), Person.Sex.FEMALE, "1", 18);
Person person2 = new Person("李四", LocalDate.now(), Person.Sex.MALE, "2", 24);
Person person3 = new Person("王五", LocalDate.now(), Person.Sex.FEMALE, "3", 30);
Person person4 = new Person("赵六", LocalDate.now(), Person.Sex.MALE, "4", 36);
List list = new ArrayList();
list.addAll(Arrays.asList(person1, person2, person3, person4));
printPersons(list, p -> p.getAge() > 18 ,p-> p.getAge() < 36);
}
输出结果
李四
王五
- Predicate.negate()
public static void printPersons(List<Person> roster, Predicate<Person> tester) {
for (Person p : roster) {
if (tester.negate().test(p)) {
p.printPerson();
}
}
}
找出不满足条件的
public static void main(String[] args) {
Person person1 = new Person("张三", LocalDate.now(), Person.Sex.FEMALE, "1", 18);
Person person2 = new Person("李四", LocalDate.now(), Person.Sex.MALE, "2", 24);
Person person3 = new Person("王五", LocalDate.now(), Person.Sex.FEMALE, "3", 30);
Person person4 = new Person("赵六", LocalDate.now(), Person.Sex.MALE, "4", 36);
List list = new ArrayList();
list.addAll(Arrays.asList(person1, person2, person3, person4));
printPersons(list, p -> p.getAge() > 18 && p.getAge() < 36);
}
输出结果
张三
赵六
- Predicate.or()
public static void printPersons(List<Person> roster, Predicate<Person> tester,Predicate<Person> tester2) {
for (Person p : roster) {
if (tester.or(tester2).test(p)) {
p.printPerson();
}
}
}
找出满足任意一种条件的
public static void main(String[] args) {
Person person1 = new Person("张三", LocalDate.now(), Person.Sex.FEMALE, "1", 18);
Person person2 = new Person("李四", LocalDate.now(), Person.Sex.MALE, "2", 24);
Person person3 = new Person("王五", LocalDate.now(), Person.Sex.FEMALE, "3", 30);
Person person4 = new Person("赵六", LocalDate.now(), Person.Sex.MALE, "4", 36);
List list = new ArrayList();
list.addAll(Arrays.asList(person1, person2, person3, person4));
printPersons(list, p -> p.getAge() > 18 ,p-> p.getAge() < 36);
}
输出结果
张三
李四
王五
赵六
- Predicate.isEqual()
public static void printPersons(List<Person> roster, Predicate<Person> tester) {
for (Person p : roster) {
if (tester.test(p)) {
p.printPerson();
}
}
}
找出与该对象相同的
public static void main(String[] args) {
Person person1 = new Person("张三", LocalDate.now(), Person.Sex.FEMALE, "1", 18);
Person person2 = new Person("李四", LocalDate.now(), Person.Sex.MALE, "2", 24);
Person person3 = new Person("王五", LocalDate.now(), Person.Sex.FEMALE, "3", 30);
Person person4 = new Person("赵六", LocalDate.now(), Person.Sex.MALE, "4", 36);
List list = new ArrayList();
list.addAll(Arrays.asList(person1, person2, person3, person4));
printPersons(list, Predicate.isEqual(person1));
}
输出结果
张三
2、Consumer<T>
用来执行某个方法,没有返回值
@FunctionalInterface
public interface Consumer<T> {
void accept(T t);
default Consumer<T> andThen(Consumer<? super T> after) {
Objects.requireNonNull(after);
return (T t) -> { accept(t); after.accept(t); };
}
}
- Consumer.accept()
public static void printPersons(List<Person> roster, Predicate<Person> tester, Consumer<Person> block) {
for (Person p : roster) {
if (tester.test(p)) {
block.accept(p);
}
}
}
执行输出姓名方法
public static void main(String[] args) {
Person person1 = new Person("张三", LocalDate.now(), Person.Sex.FEMALE, "1", 18);
Person person2 = new Person("李四", LocalDate.now(), Person.Sex.MALE, "2", 24);
Person person3 = new Person("王五", LocalDate.now(), Person.Sex.FEMALE, "3", 30);
Person person4 = new Person("赵六", LocalDate.now(), Person.Sex.MALE, "4", 36);
List list = new ArrayList();
list.addAll(Arrays.asList(person1, person2, person3, person4));
printPersons(list,person -> person.getAge()>18,Person::printPerson);
}
输出结果
李四
王五
赵六
- Consumer.andThen()
public static void printPersons(List<Person> roster, Predicate<Person> tester, Consumer<Person> block,Consumer<Person> block2) {
for (Person p : roster) {
if (tester.test(p)) {
block.andThen(block2).accept(p);
}
}
}
执行一个方法后执行另一个
public static void main(String[] args) {
Person person1 = new Person("张三", LocalDate.now(), Person.Sex.FEMALE, "1", 18);
Person person2 = new Person("李四", LocalDate.now(), Person.Sex.MALE, "2", 24);
Person person3 = new Person("王五", LocalDate.now(), Person.Sex.FEMALE, "3", 30);
Person person4 = new Person("赵六", LocalDate.now(), Person.Sex.MALE, "4", 36);
List list = new ArrayList();
list.addAll(Arrays.asList(person1, person2, person3, person4));
printPersons(list,person -> person.getAge()>18,Person::printPerson,person -> person.printAge());
}
输出结果
李四
24
王五
30
赵六
36
3、Function<T, R>
@FunctionalInterface
public interface Function<T, R> {
R apply(T t);
default <V> Function<V, R> compose(Function<? super V, ? extends T> before) {
Objects.requireNonNull(before);
return (V v) -> apply(before.apply(v));
}
default <V> Function<T, V> andThen(Function<? super R, ? extends V> after) {
Objects.requireNonNull(after);
return (T t) -> after.apply(apply(t));
}
static <T> Function<T, T> identity() {
return t -> t;
}
}
- Function.apply()
public static void printPersons(List<Person> roster, Predicate<Person> tester, Function<Person, String> mapper, Consumer<String> block) {
for (Person p : roster) {
if (tester.test(p)) {
String s = mapper.apply(p);
block.accept(s);
}
}
}
用R取接收T传出的对象
public static void main(String[] args) {
Person person1 = new Person("张三", LocalDate.now(), Person.Sex.FEMALE, "1", 18);
Person person2 = new Person("李四", LocalDate.now(), Person.Sex.MALE, "2", 24);
Person person3 = new Person("王五", LocalDate.now(), Person.Sex.FEMALE, "3", 30);
Person person4 = new Person("赵六", LocalDate.now(), Person.Sex.MALE, "4", 36);
List list = new ArrayList();
list.addAll(Arrays.asList(person1, person2, person3, person4));
printPersons(list,person -> person.getAge()>18,p->p.getEmailAddress(),e-> System.out.println(e));
}
输出结果
2
3
4
- Function.compose()
public static void printPersons(List<Person> roster, Predicate<Person> tester, Function<Person, String> mapper,Function<Person,Person> mapper2, Consumer<String> block) {
for (Person p : roster) {
if (tester.test(p)) {
String s = mapper.compose(mapper2).apply(p);
block.accept(s);
}
}
}
首先执行compose中的方法,再执行外层。内层的R类型对象要与外层T类型相同。
public static void main(String[] args) {
Person person1 = new Person("张三", LocalDate.now(), Person.Sex.FEMALE, "1", 18);
Person person2 = new Person("李四", LocalDate.now(), Person.Sex.MALE, "2", 24);
Person person3 = new Person("王五", LocalDate.now(), Person.Sex.FEMALE, "3", 30);
Person person4 = new Person("赵六", LocalDate.now(), Person.Sex.MALE, "4", 36);
List list = new ArrayList();
list.addAll(Arrays.asList(person1, person2, person3, person4));
printPersons(list,person -> person.getAge()>18,p->p.getEmailAddress(),p->{
p.setEmailAddress(p.getEmailAddress()+"1");
return p;
},e-> System.out.println(e));
}
输出结果
21
31
41
- Function.andThen()
public static void printPersons(List<Person> roster, Predicate<Person> tester, Function<Person, String> mapper,Function<String,String> mapper2, Consumer<String> block) {
for (Person p : roster) {
if (tester.test(p)) {
String s = mapper.andThen(mapper2).apply(p);
block.accept(s);
}
}
}
先执行外层,后执行内层。内层的T类型对象要跟外层的R类型相同。
public static void main(String[] args) {
Person person1 = new Person("张三", LocalDate.now(), Person.Sex.FEMALE, "1", 18);
Person person2 = new Person("李四", LocalDate.now(), Person.Sex.MALE, "2", 24);
Person person3 = new Person("王五", LocalDate.now(), Person.Sex.FEMALE, "3", 30);
Person person4 = new Person("赵六", LocalDate.now(), Person.Sex.MALE, "4", 36);
List list = new ArrayList();
list.addAll(Arrays.asList(person1, person2, person3, person4));
printPersons(list,person -> person.getAge()>18,p->p.getEmailAddress(),p->p+"2",e-> System.out.println(e));
}
输出结果
22
32
42
- Function.identity()
public static void printPersons(List<Person> roster, Predicate<Person> tester, Function<Object, Object> mapper, Consumer<String> block) {
for (Person p : roster) {
if (tester.test(p)) {
Object s = mapper.apply(p);
block.accept(s.toString());
}
}
}
会将整个对象原样传入
public static void main(String[] args) {
Person person1 = new Person("张三", LocalDate.now(), Person.Sex.FEMALE, "1", 18);
Person person2 = new Person("李四", LocalDate.now(), Person.Sex.MALE, "2", 24);
Person person3 = new Person("王五", LocalDate.now(), Person.Sex.FEMALE, "3", 30);
Person person4 = new Person("赵六", LocalDate.now(), Person.Sex.MALE, "4", 36);
List list = new ArrayList();
list.addAll(Arrays.asList(person1, person2, person3, person4));
printPersons(list,person -> person.getAge()>18,Function.identity(),e-> System.out.println(e));
}
输出结果
Person(name=李四, birthday=2022-01-09, gender=MALE, emailAddress=2, age=24)
Person(name=王五, birthday=2022-01-09, gender=FEMALE, emailAddress=3, age=30)
Person(name=赵六, birthday=2022-01-09, gender=MALE, emailAddress=4, age=36)