Java Stream来写算法08——公约数

16 篇文章 0 订阅
16 篇文章 0 订阅

总目录

  • 公约数查找方法与求约数的内容大体相同
  • 不同之处在于,如果是求两个数的公约数,需要把不同的数据剔除,保留相同的
  • 这个操作一看就类似于集合的求并集操作,所以使用Set数据结构就是非常自然的做法了
  • 再把制作思路唠叨一遍
  • 首先初始化两个Set实例,用来保存每个数自己的约数
  • 求约数的过程就是,从数字1开始,向这个数的开根号的值,逐个增加,增加过程中,看一下这个数是不是约数,如果是就将这个数加入到集合Set中
  • 由于求约数的范围只到开根号值处,所以还要约数的另一个约数也要增加进来,使用的方法,在求出每一个约数后,再求出另一个约数,只要不相同,就添加进来

代码

BiConsumer<Integer, Integer> commonFactors = (v1, v2) -> {
    int max = v1 > v2 ? v1 : v2;
    int min = v1 > v2 ? v2 : v1;
    int maxFactor = Double.valueOf(Math.sqrt(max)).intValue();
    Set<Integer> set1 = new HashSet<>();
    Set<Integer> set2 = new HashSet<>();
    IntStream.iterate(1, v -> v + 1).limit(maxFactor).filter(v -> max % v == 0).forEach(e -> {
        set1.add(e);
        int e1 = max / e;
        if (e1 != e) {
            set1.add(e1);
        }
    });
    maxFactor = Double.valueOf(Math.sqrt(min)).intValue();
    IntStream.iterate(1, v -> v + 1).limit(maxFactor).filter(v -> min % v == 0).forEach(e -> {
        set2.add(e);
        int e1 = min / e;
        if (e1 != e) set2.add(e1);
    });
    set1.retainAll(set2);// 集合的交集方法
    System.out.println(set1);
};
  • 代码是使用属性,而非方法,当然可以改造成方法
  • 使用属性并不是比方法更好,但目前感觉用属性的方式,可以使用函数式接口,感觉有点高大上
  • 调用代码也非常简单,用类的实例.属性名.accept方法即可
ss.commonFactors.accept(12, 8);// ss是我定义的实例名
  • 写到这里,有一个感觉,以后的方法好像都可以用函数式接口来全面取代了
  • 用函数式接口的一个好处是,你再也不用为方法起名发愁了
  • 另外也许就不用定义标准接口文档来定义方法了,这些函数式接口就是标准接口,而且全通用
  • 只有当输入参数与输出值不与标准函数式接口匹配时,只要重新定义新的函数式接口就可以了,通过这种方式实现新的标准
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值