《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));
    }

}
相关推荐
苏辰澈14 分钟前
C++自己的族谱规则:继承详解下
c语言·开发语言·c++·visualstudio
Wang's Blog15 分钟前
Java框架 SpringCloud 快速入门: Eureka 服务注册
java·spring cloud·eureka
seahahacsdn17 分钟前
Windows系统添加VHD双系统
windows·vhd系统·vhd双系统
hunter19901018 分钟前
英语作文题目
开发语言
liangshanbo121519 分钟前
请求拦截器相关面试题
java·前端·javascript
她说彩礼65万23 分钟前
C语言 const的使用
java·服务器·c语言
开开心心就好26 分钟前
视频压缩工具推荐,绿色版免安装双击即用
java·前端·人工智能·spring·智能手机·intellij-idea·excel
Wang's Blog29 分钟前
Java框架 SpringCloud 快速入门: Eureka 注册中心的搭建
java·spring cloud·eureka
谢亮_vipxieliang33 分钟前
Go基础数据类型全解
开发语言·后端·golang
泡海椒34 分钟前
JQuick-Excel 导入反向映射实战:让中文表头稳定落到业务字段
开发语言·python·excel