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

}
相关推荐
你怎么知道我是队长3 分钟前
C语言---文件读写
java·c语言·开发语言
陌路204 分钟前
C++30 STL容器 -deque双端队列
开发语言·c++
xb113222 分钟前
C#委托详解
开发语言·c#
brent42322 分钟前
DAY50复习日
开发语言·python
木头程序员31 分钟前
前端(包含HTML/JavaScript/DOM/BOM/jQuery)基础-暴力复习篇
开发语言·前端·javascript·ecmascript·es6·jquery·html5
Data_agent42 分钟前
Cocbuy 模式淘宝 / 1688 代购系统(欧美市场)搭建指南
开发语言·python
wszy18091 小时前
外部链接跳转:从 App 打开浏览器的正确姿势
java·javascript·react native·react.js·harmonyos
lsx2024061 小时前
《Foundation 下拉菜单》
开发语言
期待のcode1 小时前
认识Java虚拟机
java·开发语言·jvm
raining_peidx1 小时前
xxljob源码
java·开发语言