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

}
相关推荐
佛系小嘟嘟5 分钟前
Android Jetpack Compose开发小组件【入门篇】
android·开发语言·android jetpack·小组件
Java知识日历1 小时前
【内含例子代码】Spring框架的设计模式应用(第二集)
java·开发语言·后端·spring·设计模式
尘浮生3 小时前
Java项目实战II基于微信小程序的家庭大厨(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven
Java知识技术分享4 小时前
spring boot通过文件配置yaml里面的属性
java·spring boot·后端
军训猫猫头4 小时前
36.Add的用法 C#例子
开发语言·c#
一休哥助手4 小时前
深入解析Spring Boot项目的类加载与启动流程
java·spring boot·后端
丁总学Java4 小时前
定义一个名为 MyCache 的 Spring 配置类
java·spring
m0_634601664 小时前
2025.1.2
java·服务器·数据库
暗碳5 小时前
cloudns二级免费域名python更新ipv6 dns记录
开发语言·python