每日一技之Java中的Stream

502 阅读1分钟

今天学习到了一个东西, 叫Stream. 是jdk 1.8中新加入的内容. 具体可以分为

  • Stream
  • IntStream
  • LongStream
  • DoubleStream

用法都差不多, 下面以IntStream为例, 简单演示下用法

package mainJava;

import java.util.Collections;
import java.util.function.IntSupplier;
import java.util.function.Supplier;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import java.util.stream.Stream;

/**
 * Created by yanyongjun on 2020/3/16.
 */
public class Main {
    public static void main(String[] args) {
        IntStream.range(1, 3).forEach(s -> System.out.println(s));
        println("------");
        IntStream.rangeClosed(1, 3).forEach(s -> System.out.println(s));
        println("-------");
        IntStream.of(1, 2, 4).forEach(s -> System.out.println(s));
        println("------");
        IntStream.of(1, 2, 3).map(s -> s * s).forEach(s -> println(s + ""));
        println("-----");
        IntStream.of(1, 3, 2).sorted().forEach(s -> println(s + ""));
        println("----");
        IntStream.of(1, 2, 3).filter(s -> s > 2).forEach(s -> println(s + ""));
        println("-----");
        IntStream.of(1, 3, 4, 5, 6, 7, 8, 9).parallel().forEach(s -> {
            println(s + "");
        });
        println("-----");
        IntStream.of(1, 2, 3, 4).reduce((left, right) -> {
            println("left:" + left);
            println("right:" + right);
            return left + right;
        }).getAsInt();
    }

    static void println(String s) {
        System.out.println(Thread.currentThread() + " : " + s);
    }
}

看一下输出结果

1
2
Thread[main,5,main] : ------
1
2
3
Thread[main,5,main] : -------
1
2
4
Thread[main,5,main] : ------
Thread[main,5,main] : 1
Thread[main,5,main] : 4
Thread[main,5,main] : 9
Thread[main,5,main] : -----
Thread[main,5,main] : 1
Thread[main,5,main] : 2
Thread[main,5,main] : 3
Thread[main,5,main] : ----
Thread[main,5,main] : 3
Thread[main,5,main] : -----
Thread[main,5,main] : 7
Thread[main,5,main] : 6
Thread[ForkJoinPool.commonPool-worker-2,5,main] : 9
Thread[ForkJoinPool.commonPool-worker-2,5,main] : 8
Thread[ForkJoinPool.commonPool-worker-3,5,main] : 3
Thread[ForkJoinPool.commonPool-worker-4,5,main] : 1
Thread[ForkJoinPool.commonPool-worker-1,5,main] : 4
Thread[ForkJoinPool.commonPool-worker-2,5,main] : 5
Thread[main,5,main] : -----
Thread[main,5,main] : left:1
Thread[main,5,main] : right:2
Thread[main,5,main] : left:3
Thread[main,5,main] : right:3
Thread[main,5,main] : left:6
Thread[main,5,main] : right:4

其实可以从方法名上, 就可以看出, Stream的实现借鉴了Rxjava的很多东西, RxJava可以休息了

值得一提的是, 有一个parallel方法, 表示在多线程下实现, 这个比较奇葩, 要注意后面可能有并发问题