JAVA8(二)

行为参数化

什么是行为参数化

个人理解:把行为抽象出来进行封装,让代码适应需求的变化,并把行为或代码作为参数传递,并且遵循一些设计原则。

这让我想起了一个设计模式:策略模式(封装算法族,动态改变算法使用者无感知)

interface Action {
    
}

class ActionA implements Action {
    
}

class ActionB implements Action {
    
}

JAVA8中行为参数化

一个方法接受多个不同的行为作为参数,并在内部使用他们,完成不同行为的能力

实例:

假如你是金融公司的程序员,根据条件筛选出一些客户,筛选维度:逾期数、逾期金额、年龄、性别等

客户贷后资料实体:


public class Customer {
    private int overduePeriod;
    private double amount;
    private int gender;
    private int age;
    
    public Customer() {
        
    }
    
    public Customer(int overduePeriod, double amount, int gender, int age) {
        super();
        this.overduePeriod = overduePeriod;
        this.amount = amount;
        this.gender = gender;
        this.age = age;
    }
    public int getOverduePeriod() {
        return overduePeriod;
    }
    public void setOverduePeriod(int overduePeriod) {
        this.overduePeriod = overduePeriod;
    }
    public double getAmount() {
        return amount;
    }
    public void setAmount(double amount) {
        this.amount = amount;
    }
    public int getGender() {
        return gender;
    }
    public void setGender(int gender) {
        this.gender = gender;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}

谓词:

public interface Predicat<T> {
    boolean judge(T t);
}

过滤:

import java.util.ArrayList;
import java.util.List;

public class Filter {
    
    private static List<Customer> customers = new ArrayList<>();
    
    public static void main(String[] args) {
        // 初始化list
        init();
        
        // 匿名类的方式
        List<Customer> list = filter(customers, new Predicat<Customer>() {
            @Override
            public boolean judge(Customer c) {
                // 逾期数大于12期同时金额必须大于10000
                return c.getOverduePeriod() >= 12 && c.getAmount() > 10000;
            }
        });
        System.out.println("客户数:" + list.size() + "  " + list);
        
        // lambda
        List<Customer> list2 = filter(customers, (Customer c) -> c.getOverduePeriod() >= 12 && c.getAmount() > 10000);
        System.out.println("客户数:" + list2.size() + "  " + list2);
    }
    
    public static void init() {
        for (int i = 0; i < 100; i++) {
            Customer c = new Customer((int) (Math.random() * 100),  Math.random() * (i + 1) * 100000, i % 2, (int)(Math.random() * 100));
            customers.add(c);
        }
    }
    
    public static <T> List<T> filter(List<T> list, Predicat<T> p) {
        List<T> result = new ArrayList<>();
        for (T t : list) {
            if (p.judge(t)) {
                result.add(t);
            }
        }
        return result;
    } 
}

java8既然支持lambda,就最好不要用匿名类的方式:

一、匿名类笨重占用空间

二、匿名类可读性差

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Java8 in action 没有共享的可变数据,将方法和函数即代码传递给其他方法的能力就是我们平常所说的函数式...
    铁牛很铁阅读 1,274评论 1 2
  • 第一章 为什么要关心Java 8 使用Stream库来选择最佳低级执行机制可以避免使用Synchronized(同...
    谢随安阅读 1,517评论 0 4
  • Spenser说,好文章不是写出来的,好文章就像一个产品,是做出来的。你要像一个产品经理一样去写文章,一篇好文章就...
    顾尘埃阅读 250评论 0 2
  • 一弯腰 闻到了玫瑰花酱的味道
    触角_阅读 135评论 0 0