- 公约数查找方法与求约数的内容大体相同
- 不同之处在于,如果是求两个数的公约数,需要把不同的数据剔除,保留相同的
- 这个操作一看就类似于集合的求并集操作,所以使用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);
- 写到这里,有一个感觉,以后的方法好像都可以用函数式接口来全面取代了
- 用函数式接口的一个好处是,你再也不用为方法起名发愁了
- 另外也许就不用定义标准接口文档来定义方法了,这些函数式接口就是标准接口,而且全通用
- 只有当输入参数与输出值不与标准函数式接口匹配时,只要重新定义新的函数式接口就可以了,通过这种方式实现新的标准