当前位置: 首页 > article >正文

《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将两个流连接起来。

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

综合案例:

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

}


http://www.kler.cn/a/460829.html

相关文章:

  • 攻破 kioprix level 4 靶机
  • C++语言编程————C++数据类型与表达式
  • 期权懂|国内场外期权都有哪些种类?
  • MybatisPlus查询更so easy
  • 数据结构与算法之动态规划: LeetCode 62. 不同路径 (Ts版)
  • 非常简单实用的前后端分离项目-仓库管理系统(Springboot+Vue)part 5(未实现预期目标)
  • Pytest 高级用法:间接参数化
  • 25考研希望渺茫,工作 VS 二战,怎么选?
  • 2024年RAG:回顾与展望
  • KEGG大更新:开启生物研究新纪元
  • 物联网技术在电商API接口中的应用实践
  • Spring Boot中使用Zookeeper实现分布式锁的案例
  • SQL相关子查询
  • 【数据分析】基于GEE的2000-2023年逐年归一化差值水分指数(NDMI)获取-以成都市为例
  • neo4j图数据库简介
  • AI的未来?华为仓颉编程语言与人工智能的接轨
  • 【网络协议】什么是 BGP? | 解释 BGP 路由
  • 【算法题解】B. President‘s Office - Python实现
  • 如何利用小程序高效获客,小程序引流怎么样
  • 大语言模型提示词工程 - ReACT 推理模式