package me.test.jdk.java.util.stream; import java.time.Duration; import java.util.Arrays; import java.util.List; import java.util.stream.IntStream; import java.util.stream.LongStream; /** * Study IntStream */ public class IntStreamTest { public static void main(String[] args) { IntStream intStream = IntStream.range(0, 10); LongStream longStream = LongStream.range(Long.MIN_VALUE, Long.MAX_VALUE); List<Object> list = Arrays.asList(1, 2L, "A", 3.3, true, 1, 4, 2); // 循环 System.out.print("intStream : "); intStream.forEach(value -> System.out.print(value)); System.out.println(); // IntStream 不能重复使用 // System.out.println(intStream.count()); // 计数 - 注意: 这将遍历每一个元素, 非常耗时。 System.out.println("list count : " + list.stream().count()); // System.out.println(longStream.count()); // 注意: 2L != 2 System.out.println("list distinct : " + Arrays.toString(list.stream().distinct().toArray())); // Map-Reduce int bigNum = 10_0000; // 如果仅仅分片查找数据, 时间还是相差很大的 // 1.1 : PT0.555S // 1.2 : PT1.578S // testParallel1(bigNum); // 如果分片处理后,在合并在一起排序, 则不如单线程进行 // 2.1 : PT1.555S // 2.2 : PT1.325S testParallel2(bigNum); } static void testParallel1(int bigNum) { long start1 = System.currentTimeMillis(); IntStream.range(0, bigNum) .parallel() .filter(IntStreamTest::isPrime) .forEach(System.out::println); long end1 = System.currentTimeMillis(); System.out.println("================================================= "); long start2 = System.currentTimeMillis(); IntStream.range(0, bigNum) .filter(IntStreamTest::isPrime) .forEach(System.out::println); long end2 = System.currentTimeMillis(); System.out.println("1.1 : " + Duration.ZERO.plusMillis(end1 - start1)); System.out.println("1.2 : " + Duration.ZERO.plusMillis(end2 - start2)); } static void testParallel2(int bigNum) { long start1 = System.currentTimeMillis(); IntStream.range(0, bigNum) .parallel() .filter(IntStreamTest::isPrime) .sequential() .sorted() .forEach(System.out::println); long end1 = System.currentTimeMillis(); System.out.println("================================================= "); long start2 = System.currentTimeMillis(); IntStream.range(0, bigNum) .filter(IntStreamTest::isPrime) .sorted() .forEach(System.out::println); long end2 = System.currentTimeMillis(); System.out.println("2.1 : " + Duration.ZERO.plusMillis(end1 - start1)); System.out.println("2.2 : " + Duration.ZERO.plusMillis(end2 - start2)); } /** * 判断是否是素数 */ static boolean isPrime(int number) { if (number <= 1) { return false; } for (int i = 2; i < number; i++) { if (number % i == 0) { return false; } } return true; } }