javarandom函数用法 java随机函数怎么写( 二 )


IntStream// 整型流.range(1, 2048)// 生成此范围内的整型流.parallel()// 为多个线程分区数据.filter(i -> ((i & 0x1) > 0))// 奇偶校验 - 只允许奇数通过.forEach(System.out::println); // 打印每个值 IntStream 类型包括一个 range 函数,该函数在指定的范围内生成一个整数值流,在本例中,以 1 为增量,从 1 递增到 2048 。parallel 函数自动划分该工作到多个线程中,在各个线程中进行过滤和打印 。(线程数通常与主机系统上的 CPU 数量匹配 。)函数 forEach 参数是一个方法引用,在本例中是对封装在 System.out 中的 println 方法的引用,方法输出类型为 PrintStream 。方法和构造器引用的语法将在稍后讨论 。
由于具有多线程,因此整数值整体上以任意顺序打印,但在给定线程中是按顺序打印的 。例如,如果线程 T1 打印 409 和 411,那么 T1 将按照顺序 409-411 打印,但是其它某个线程可能会预先打印 2045 。parallel 调用后面的线程是并发执行的,因此它们的输出顺序是不确定的 。
map/reduce 模式 map/reduce 模式在处理大型数据集方面变得很流行 。一个 map/reduce 宏操作由两个微操作构成 。首先,将数据分散( 映射(mapped))到各个工作程序中,然后将单独的结果收集在一起 —— 也可能收集统计起来成为一个值,即 归约(reduction) 。归约可以采用不同的形式,如以下示例所示 。
下面 Number 类的实例用 EVEN 或 ODD 表示有奇偶校验的整数值:
public class Number {enum Parity { EVEN, ODD }private int value;public Number(int n) { setValue(n); }public void setValue(int value) { this.value = https://www.haocat.cn/shenghuo/value; }public int getValue() { return this.value; }public Parity getParity() {return ((value & 0x1) == 0) ? Parity.EVEN : Parity.ODD;}public void dump() {System.out.format(\\\\"Value: - (parity: %s)n\\\\", getValue(),(getParity() == Parity.ODD ? \\\\"odd\\\\" : \\\\"even\\\\"));}} 下面的代码演示了用 Number 流进行 map/reduce 的情形,从而表明流 API 不仅可以处理 int 和 float 等基本类型,还可以处理程序员自定义的类类型 。
在下面的代码段中,使用了 parallelStream 而不是 stream 函数对随机整数值列表进行流化处理 。与前面介绍的 parallel 函数一样,parallelStream 变体也可以自动执行多线程 。
final int howMany = 200;Random r = new Random();Number[] nums = new Number[howMany];for (int i = 0; i < howMany; i) nums[i] = new Number(r.nextInt(100));List listOfNums = Arrays.asList(nums);// 将数组转化为 listInteger sum4All = listOfNums.parallelStream()// 自动执行多线程.mapToInt(Number::getValue) // 使用方法引用,而不是 lambda.sum();// 将流值计算出和值System.out.println(\\\\"The sum of the randomly generated values is: \\\\"sum4All); 高阶的 mapToInt 函数可以接受一个 lambda 作为参数,但在本例中,它接受一个方法引用,即 Number::getValue 。getValue 方法不需要参数,它返回给定的 Number 实例的 int 值 。语法并不复杂:类名 Number 后跟一个双冒号和方法名 。回想一下先前的例子 System.out::println,它在 System 类中的 static 属性 out 后面有一个双冒号 。

猜你喜欢