JDK8 新特性学习(一)Lambda表达式

本文介绍了JDK8中的Lambda表达式,包括Predicate、Consumer和Function接口的使用。Predicate用于布尔判断,如测试年龄;Consumer实现无返回值操作,如打印姓名;Function则用于类型转换,如年龄加法运算。文章通过实例详细阐述了这些接口的方法,如test(), accept(), apply()等,并展示了它们的组合使用。" 116138065,10248123,航空公司的LRFMC客户价值分群分析,"['聚类', '数据分析']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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);
    }
  1. 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);
    }

输出结果

李四
王五

  1. 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);
    }

输出结果

李四
王五

  1. 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);
    }

输出结果

张三
赵六

  1. 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);
    }

输出结果

张三
李四
王五
赵六

  1. 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); };
    }
}
  1. 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);
    }

输出结果

李四
王五
赵六

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

  1. 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

  1. 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

  1. 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)

下一章 JDK8 新特性学习(二)Stream流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值