最近在学习java 8 在书中有这样一个例子 给一个数在 100以内求他的勾股数:
也就是 sqrt(3*3+4*4)%1=0 那么这样就满足这样的条件 :
上代码 :
int a = 9; //1..1000 里面有哪一个值可以满足 勾股 //返回一个数组 int [a,b,c] IntStream stream1 = IntStream.rangeClosed(1, 100) //相当于切片一样 里面的元素是1-100 .filter(b -> Math.sqrt(a * a + b * b) % 1 == 0);
这里面的 rangeClosed(1,100) 的意思是int类型的stream 里面的元素是1-100
我们给他输出一下看一下结果:
stream1.forEach(System.out::print);
执行之后结果分别试12, 40
也就是说, 9和12 和某个数满足条件, 9和40 和某个数满足这个条件 ,这才求出两个数了 那么另一个数呢?
我们需要返回一个数组 所以需要对上面的进行改进
返回一个数组 int [a,b,c]
IntStream.rangeClosed(1, 100) //相当于切片一样 里面的元素是1-100 .filter(b -> Math.sqrt(a * a + b * b) % 1 == 0). boxed(). map(b -> new int[]{a, b, (int)Math.sqrt(a * a + b * b)}) .forEach(r -> System.out.println("a=" + r[0] + ",c=" + r[1] + ",c=" + r[2]));
这里的boxed 是装箱的功能 这样就把 Intstream 转化成 Stream<Integer> 为甚吗装箱因为 装箱之后的map方法就可以操作了
输出结果看一下:
a=9,c=12,c=15
a=9,c=40,c=41
验证一下:
System.out.println(41*41); System.out.println(9*9+40*40); 1681 1681
结果一样 这样我们一个数的勾股数也就都出来了
java 8非常 强大的
也可以这样写哦:
IntStream.rangeClosed(1, 100) .filter(b -> Math.sqrt(a * a + b * b) % 1 == 0) .mapToObj(b -> new int[]{a, b, (int) Math.sqrt(a * a + b * b)}) .forEach(r -> System.out.println("a=" + r[0] + ",b=" + r[1] + ",c=" + r[2]));