创建Stream流

创建Stream流

创建一个stream流

最便捷的创建stream流是从Collection接口的stream()方法。

使用Stream接口的工厂模式方法创建stream流

  1. Stream.of(), Arrays.stream()
  2. Stream.generate()
  3. Stream.iterate(), StreamSupport.stream()
  4. Stream.builder()
  5. Stream.empty()
  6. IntStream.range(), IntStream.rangeClosed(), LongStream.range(), LongStream.rangeClosed()

通过特殊的jdk对象创建stream流

  1. String.chars()
  2. BufferedReader.lines(), LineNumberReader.lines(), Files.lines()
  3. Pattern.compile().splitAsStream()
  4. Random.ints(), Random.longs(), Random.doubles()
  5. HttpClient.send(request, HttpResponse.BodyHandlers.ofLines())

CollectionIterator创建stream流

Collection接口的stream()方法。

Iterator接口

Iterator<String> iterator = ...;

long estimateSize = 10L;
int characteristics = 0;
Spliterator<String> spliterator = Spliterators.spliterator(iterator, estimateSize, characteristics);

boolean parallel = false;
Stream<String> stream = StreamSupport.stream(spliterator, parallel);

创建空的stream流

Stream<String> empty = Stream.empty();
List<String> strings = empty.collect(Collectors.toList());

System.out.println("strings = " + strings);

结果

strings = []

从变参或数组创建stream流

变参

Stream<Integer> intStream = Stream.of(1, 2, 3);
List<Integer> ints = intStream.collect(Collectors.toList());

System.out.println("ints = " + ints);

结果

ints = [1, 2, 3]

数组

String[] stringArray = {"one", "two", "three"};
Stream<String> stringStream = Arrays.stream(stringArray);
List<String> strings = stringStream.collect(Collectors.toList());

System.out.println("strings = " + strings);

结果

strings = [one, two, three]

Supplier创建stream流

Stream<String> generated = Stream.generate(() -> "+");
List<String> strings = generated.collect(Collectors.toList());

请注意,这会产生无穷的stream流,最终会抛出OutOfMemoryError错误,你应该使用limit()改进

Stream<String> generated = Stream.generate(() -> "+");
List<String> strings = 
        generated
           .limit(10L)
           .collect(Collectors.toList());

System.out.println("strings = " + strings);

结果

strings = [+, +, +, +, +, +, +, +, +, +]

UnaryOperator和seed(种子)生成stream流

Stream<String> iterated = Stream.iterate("+", s -> s + "+");
iterated.limit(5L).forEach(System.out::println);

结果

+
++
+++
++++
+++++

这同样是无穷stream流需要添加limit()

jdk9新增了iterate(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next)当predicate返回false时,停止生成元素。

Stream<String> iterated = Stream.iterate("+", s -> s.length() <= 5, s -> s + "+");
iterated.forEach(System.out::println);

创建范围数stream流

range()[)rangeClosed()[]

String[] letters = {"A", "B", "C", "D"};
List<String> listLetters =
    IntStream.range(0, 10)
             .mapToObj(index -> letters[index % letters.length])
             .collect(Collectors.toList());
System.out.println("listLetters = " + listLetters);

结果

listLetters = [A, B, C, D, A, B, C, D, A, B]

创建随机数stream流

Random random = new Random(314L);
List<Integer> randomInts = 
    random.ints(10, 1, 5)
          .boxed()
          .collect(Collectors.toList());
System.out.println("randomInts = " + randomInts);

结果

randomInts = [4, 4, 3, 1, 1, 1, 2, 2, 4, 2]

从字符串的字符创建stream流

jdk9新增String.chars()

String sentence = "Hello Duke";
List<String> letters =
    sentence.chars()
            .mapToObj(codePoint -> (char)codePoint)
            .map(Object::toString)
            .collect(Collectors.toList());
System.out.println("letters = " + letters);

jdk11新增Character.toString()

String sentence = "Hello Duke";
List<String> letters =
    sentence.chars()
            .mapToObj(Character::toString)
            .collect(Collectors.toList());
System.out.println("letters = " + letters);

结果

letters = [H, e, l, l, o,  , D, u, k, e]

从文本文件的行创建stream流

文件I/O资源使用后需要释放资源,Stream接口实现了AutoCloseable接口,可以使用try-with-resources模式优雅的关闭资源

Path log = Path.of("/tmp/debug.log"); // adjust to fit your installation
try (Stream<String> lines = Files.lines(log)) {
    
    long warnings = 
        lines.filter(line -> line.contains("WARNING"))
             .count();
    System.out.println("Number of warnings = " + warnings);
    
} catch (IOException e) {
    // do something with the exception
}

从正则表达式创建stream流

使用String.split()

String sentence = "For there is good news yet to hear and fine things to be seen";

String[] elements = sentence.split(" ");
Stream<String> stream = Arrays.stream(elements);

使用Pattern.compile().splitAsStream()

String sentence = "For there is good news yet to hear and fine things to be seen";

Pattern pattern = Pattern.compile(" ");
Stream<String> stream = pattern.splitAsStream(sentence);
List<String> words = stream.collect(Collectors.toList());

System.out.println("words = " + words);

Pattern.compile().splitAsStream()没有创建数组,所以开销更小。

使用构建模式创建stream流

一旦构建器用于创建stream流,就不能向其中添加更多元素,也不能再次使用它来构建另一个stream流

Stream.Builder<String> builder = Stream.<String>builder();

builder.add("one")
       .add("two")
       .add("three")
       .add("four");

Stream<String> stream = builder.build();

List<String> list = stream.collect(Collectors.toList());
System.out.println("list = " + list);

结果

list = [one, two, three, four]

在HTTP源上创建stream流

// The URI of the file
URI uri = URI.create("https://www.gutenberg.org/files/98/98-0.txt");

// The code to open create an HTTP request
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder(uri).build();


// The sending of the request
HttpResponse<Stream<String>> response = client.send(request, HttpResponse.BodyHandlers.ofLines());
List<String> lines;
try (Stream<String> stream = response.body()) {
    lines = stream
        .dropWhile(line -> !line.equals("A TALE OF TWO CITIES"))
        .takeWhile(line -> !line.equals("*** END OF THE PROJECT GUTENBERG EBOOK A TALE OF TWO CITIES ***"))
        .collect(Collectors.toList());
}
System.out.println("# lines = " + lines.size());

结果

# lines = 15904
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值