java8 Limbda表达式的演化demo

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java8 Limbda表达式的演化demo相关的知识,希望对你有一定的参考价值。

需求:按年龄或者薪水搜索员工

技术分享
  //原始方式:使用两个方法完成按不同条件搜索
    private static void test1() {
        List<Emplyee> emplyeeList= Arrays.asList(
                new Emplyee("夏侯惇",40,4000),
                new Emplyee("张郃",30,3000),
                new Emplyee("许褚",50,5000)
        );
        //按年龄搜索
        List<Emplyee> list1=filterByAge(emplyeeList);
        list1.forEach(System.out::println);
        System.out.println("==--------------==");
        //按工资搜索
        List<Emplyee> list2=filterBySalary(emplyeeList);
        list2.forEach(System.out::println);
    }
    //按年龄搜索
    private static List<Emplyee> filterByAge(List<Emplyee> listInput){
        List<Emplyee> listRtn=new ArrayList<>();
        for(Emplyee e:listInput){
            if(e.getAge()>35){
                listRtn.add(e);
            }
        }
        return listRtn;
    }
    //按工资搜索
    private static List<Emplyee> filterBySalary(List<Emplyee> listInput){
        List<Emplyee> listRtn=new ArrayList<>();
        for(Emplyee e:listInput){
            if(e.getSalary()<4000){
                listRtn.add(e);
            }
        }
        return listRtn;
    }
原始方式:使用两个方法完成按不同条件搜索
技术分享
 //优化方式一:策略模式
    private  void test2() {
        List<Emplyee> emplyeeList= Arrays.asList(
                new Emplyee("夏侯惇",40,4000),
                new Emplyee("张郃",30,3000),
                new Emplyee("许褚",50,5000)
        );
        //按年龄搜索
        List<Emplyee> list1=filterEmplyee(emplyeeList, new FilterEmplyeeByAge());
        list1.forEach(System.out::println);
        System.out.println("==--------------==");
        //按工资搜索
        List<Emplyee> list2=filterEmplyee(emplyeeList,new FilterEmplyesBySalary());
        list2.forEach(System.out::println);
    }

    private List<Emplyee> filterEmplyee(List<Emplyee> listInput,MyPredicate<Emplyee> mp){
        List<Emplyee> listRtn=new ArrayList<>();
        for(Emplyee e:listInput){
            if(mp.test(e)){
                listRtn.add(e);
            }
        }
        return listRtn;
    }
优化方式一:策略模式
技术分享
  //优化方式二:匿名内部类
    private void  test3(){
        List<Emplyee> emplyeeList= Arrays.asList(
                new Emplyee("夏侯惇",40,4000),
                new Emplyee("张郃",30,3000),
                new Emplyee("许褚",50,5000)
        );
        //按年龄搜索
        List<Emplyee> list1=filterEmplyee(emplyeeList, new MyPredicate<Emplyee>() {
            @Override
            public boolean test(Emplyee t) {
                return t.getAge()>35 && t.getSalary()>4000;
            }
        });
        list1.forEach(System.out::println);
    }
优化方式二:匿名内部类
技术分享
 //优化方式三:Lambda表达式 (需要使用我们自定义的MyPredicate<Emplyee> 接口)
    private void  test4(){
        List<Emplyee> emplyeeList= Arrays.asList(
                new Emplyee("夏侯惇",40,4000),
                new Emplyee("张郃",30,3000),
                new Emplyee("许褚",50,5000)
        );
        //按年龄盒薪水搜索
        List<Emplyee> list1=filterEmplyee(emplyeeList, t->t.getAge()>35 && t.getSalary()>4000);
        list1.forEach(System.out::println);
    }
优化方式三:Lambda表达式 (需要使用我们自定义的MyPredicate 接口)
技术分享
//优化方式四:Stream API (使用java8内置的断言型接口Predicate<T> boolean test(T t);)
    private void  test5(){
        List<Emplyee> emplyeeList= Arrays.asList(
                new Emplyee("夏侯惇",40,4000),
                new Emplyee("张郃",30,3000),
                new Emplyee("许褚",50,5000)
        );
        //按年龄和薪水搜索
        List<Emplyee> list1=emplyeeList.stream().filter(i->i.getAge()>35 && i.getSalary()>4000).collect(Collectors.toList());
        list1.forEach(System.out::println);
    }
优化方式四:Stream API (使用java8内置的断言型接口Predicate boolean test(T t);)
技术分享
public interface MyPredicate<T> {
    public boolean test(T t);
}
MyPredicate 接口
技术分享
public class FilterEmplyeeByAge implements MyPredicate<Emplyee> {

    @Override
    public boolean test(Emplyee t) {
        return t.getAge()>35;
    }
}
FilterEmplyeeByAge 按年龄搜索员工实现类
技术分享
public class FilterEmplyesBySalary implements MyPredicate<Emplyee> {
    @Override
    public boolean test(Emplyee t) {
        return t.getSalary()<4000;
    }
}
FilterEmplyesBySalary 按薪水搜索员工实现类

 

以上是关于java8 Limbda表达式的演化demo的主要内容,如果未能解决你的问题,请参考以下文章

Java8新特征之Lambda

Java8新特征之Lambda

Java8中你可能不知道的一些地方之Lambda

Java的演化-Java8实战笔记

Java8的重要新特性

15Java常用类(数组工具类Arrays)基本类型包装类(Integer类)正则表达式String的split(String regex)和replaceAll(String regex, (代码片