《Java核心技术II》抽取子流和组合流

抽取子流和组合流

stream.limit(n)

stream.limit(n)会在n个元素之后结束,对裁剪无限流尺寸很有用。

产生包含100个随机数的流

Stream randoms = Stream.generate(Math::random).limit(100);

stream.skip(n)

stream.skip(n)与上面正好相反,会丢弃前n个元素。

stream.takeWhile(predicate)

调用在谓词为真时获取流中的所有元素,然后停止。

stream.dropWhile(predicate)

与上面相反,会在条件为真时丢弃元素,产生第一个条件为假的字符开始的所有元素构成的流。

Stream.concat

静态方法concat将两个流连接起来。

第一个流不应该是无限流,否则第二个流不会得到机会进行处理。

综合案例:

java 复制代码
package streams;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Stream;

public class LimitSkipTakeWhileDropWhileConcat {

    public static <T> void show(String title, Stream<T> stream) {
        final int SIZE = 10;
        List<T> firstElements = stream.limit(SIZE + 1).toList();
        System.out.print(title + ": ");
        for (int i = 0; i < firstElements.size(); i++) {
            if (i > 0)
                System.out.print(", ");
            if (i < SIZE)
                System.out.print(firstElements.get(i));
            else
                System.out.print("...");
        }
        System.out.println();
    }

    public static void main(String[] args) throws IOException {
        Path path = Path.of("./resources/alice.txt");
        var contents = Files.readString(path);
        List<String> words = List.of(contents.split("\\PL+"));
        // 获得100个随机数的流
        Stream<Double> randoms = Stream.generate(Math::random).limit(100);
        show("randoms", randoms);
        // 丢弃前3个单词
        show("原数组", words.stream());
        show("丢弃3个单词后", words.stream().skip(3));
        // takeWhile,一旦出现不满足的情况,就不进行选取了。
        List<Integer> numbers = Arrays.asList(1, 3, 19, 5, 21, 7, 9, 11, 13, 15);
        show("首次大于10的数字出现后面舍弃", numbers.stream().takeWhile(t -> t < 10));
        // dropWhile,一旦出现不满足的情况,前面的丢弃,后面的都要。
        show("首次大于10的数字出现前面舍弃", numbers.stream().dropWhile(t -> t < 10));
        // 连接两个流
        Stream<String> concat = Stream.concat(codePoints("Hello"), codePoints("World"));
        show("连接两个流", concat);
    }

    private static Stream<String> codePoints(String s) {
        // 看api,如果直接转为long或者double可以,但要转为String需要mapToObj
        return s.codePoints().mapToObj(cp -> new String(new int[] { cp }, 0, 1));
    }

}
相关推荐
weixin_3077791313 小时前
AWS Elastic Beanstalk 实现 Java 应用高可用部署指南
java·开发语言·云计算·aws·web app
nvd1113 小时前
asyncio.run() vs asyncio.gather():启动器与聚合器, 为何Jupyter notebook里能直接使用await?
开发语言·python·jupyter
萝卜白菜。14 小时前
关于Java EE应用中xml解析类的问题
xml·java·java-ee
一米阳光zw14 小时前
Spring Boot中使用 MDC实现请求TraceId全链路透传
java·spring boot·后端·traceid·mdc
文人sec14 小时前
使用python-pandas-openpyxl编写运营查询小工具
开发语言·python·pandas
王元_SmallA14 小时前
pgsql:connection failed connection to server at
java·后端
高山上有一只小老虎14 小时前
购物消费打折
java·算法
tuokuac14 小时前
@Configuration类中定义的@Bean方法
java
这儿有一堆花14 小时前
C语言递归宏详解
c语言·开发语言·c++
csbysj202014 小时前
C 标准库 - `<ctype.h>`
开发语言