Java-8中Stream的循环融合(内部如何工作)

2024-01-29

我正在读《Java in Action》一书。

而且我在书中看到了Stream的示例代码。

List<String> names = menu.stream()
                         .filter(d -> {
                                       System.out.println("filtering" + d.getName());
                                       return d.getCalories() > 300;
                                      })
                         .map(d -> {
                                    System.out.println("mapping" + d.getName());
                                    return d.getName();
                                    })
                         .limit(3)
                         .collect(toList());

执行代码后,结果如下。

filtering __1__.
mapping __1__.
filtering __2__.
mapping __2__.
filtering __3__.
mapping __3__.

也就是说,因为limit(3),日志消息仅打印3次! 在本书中,这称为“循环融合”。 但是,我不明白这一点。 因为,如果你知道一个对象是否被过滤,你就必须计算过滤函数。然后,我认为应该打印“过滤...”消息。

请解释一下循环融合内部是如何工作的。


“因为,如果你[想]知道一个对象是否被过滤,你必须计算过滤函数”,这是正确的,但也许你的样本数据不足以说明这一点。如果你试试

List<String> result = Stream.of("java", "streams", "are", "great", "stuff")
    .filter(s -> {
                  System.out.println("filtering " + s);
                  return s.length()>=4;
                 })
    .map(s -> {
               System.out.println("mapping " + s);
               return s.toUpperCase();
              })
    .limit(3)
    .collect(Collectors.toList());
System.out.println("Result:");
result.forEach(System.out::println);

它会打印

filtering java
mapping java
filtering streams
mapping streams
filtering are
filtering great
mapping great
Result:
JAVA
STREAMS
GREAT

表明

  • 为了找到与过滤器匹配的三个元素,您might必须评估三个以上的元素,这里评估四个元素,但是一旦有三个匹配,就不需要评估后续元素

  • 后续的映射函数只需要应用到matching元素。由此可以得出这样的结论:是否.map(…).limit(…)or .limit(…).map(…)被指定。
    这与相对位置不同.filter and .limit这是相关的。

“循环融合”一词意味着不存在过滤循环、映射循环、限制操作,而是只有一个循环(概念上)执行整个工作,相当于以下单个循环:

String[] source = { "java", "streams", "are", "great", "stuff"};
List<String> result = new ArrayList<>();
int limit = 3;
for(String s: source) {
    System.out.println("filtering " + s);
    if(s.length()>=4) {
        System.out.println("mapping " + s);
        String t = s.toUpperCase();
        if(limit-->0) {
            result.add(t);
        }
        else break;
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java-8中Stream的循环融合(内部如何工作) 的相关文章

随机推荐

  • 如何在每个场景之前输出Cucumber后台步骤?

    通常 Cucumber 将输出后台步骤 使其看起来与您在功能文件中定义的相同 位于顶部 bundle exec cucumber color format pretty Feature Something Background Given
  • C# 获取 Windows 中每个显示器的 DPI 缩放比例

    我正在使用 WPF 应用程序中的代码 该应用程序需要计算 Windows 中每个显示器的 DPI 缩放大小 我能够计算出主屏幕的 DPI 但由于某种原因 我无法计算出如何获取其他显示器的比例 其他显示器都返回与主显示器相同的 DPI 有一些
  • 添加重试WebClient的所有请求

    我们有一个服务器来检索 OAUTH 令牌 并且 oauth 令牌通过 WebClient filter 方法添加到每个请求中 例如 webClient mutate filter request next gt tokenProvider
  • 验证 WCF Rest Web 服务

    我在 C 中创建了一个 Web 服务 REST Web 服务 无需任何身份验证 现在 我正在考虑向网络服务添加身份验证 Web服务公开了6个方法 都是GET 在这6个方法中 我想限制 Admin 组成员对2个方法的访问 目前 我的 Web
  • SQLAlchemy外键找不到表

    当我尝试实例化时出现此错误ConsumerAdvice class Foreign key associated with column tbConsumerAdvice ConsumerAdviceCategory ID could no
  • 有没有办法将 EditText/输入字段放入主屏幕小部件中?

    我希望我的用户在主屏幕上输入一些内容 但是每次我向小部件添加 Edittext 时 它都会中断 我做了一些谷歌搜索发现它们显然在小部件中不受支持 不过 每部 Android 手机上都有一个带有输入字段的 Google 搜索小部件 所以我想知
  • React-navigation-hooks:如何测试 useFocusEffect

    据我了解 应该这样做 以便 useFocusEffect 可以作为 useEffect 进行测试 模拟 我使用 useFocusEffect 来获取数据 useFocusEffect useCallback gt fetchData fet
  • 如何从gitlab中完全删除提交?

    我在 git 存储库中进行了提交并推送了它 但意外地它包含了我们生产机器的一些密码 所以我删除了提交 git reset hard HEAD 1 git push force 这确实从提交列表中删除了该提交 但 gitlab 上提交的 ur
  • 具有不同类型中断的状态循环

    我正在尝试将以下有状态命令式代码转换为 Haskell while true while get if put1 failImmediately if put2 succeedImmediately 这俩put1 and put2读取系统的
  • Java 泛型类型转换难题

    我正在尝试使用 Google 的 Guava ImmutableSet 类来创建一组具有类似时间属性的不可变类 java util Date 和 org joda time DateTime private static final Imm
  • 如何从 GDAX websocket feed 获取实时出价/要价/价格

    API 文档不鼓励轮询 ticker端点 建议使用websocket流来监听匹配消息 但匹配响应只提供了一个price and a side 卖买 如何从 websocket feed 重新创建股票行情数据 价格 卖价和出价 price 3
  • ffmpeg:如何在视频末尾添加帧或黑色?

    如何复制任何视频末尾最后一帧的任意数量的重复项 或者 如何在任何视频的末尾添加黑帧 这可以通过脚本和 ffmpeg 来完成吗 当然 只要操作可编写脚本 任何其他工具都可以 困难在于应该支持所有视频格式 或者至少尽可能广泛的视频格式 该脚本应
  • 在没有代理设置的情况下在 VSTS 中运行 nuget 任务

    所以我认为我想要的是这篇文章的反面 VSTS NuGet 恢复失败 代理 https stackoverflow com questions 45369334 vsts nuget restore fails proxy 我们有一台本地计算
  • 在Windows中设置JAVA_HOME?

    应该在哪里JAVA HOME指向 JDK 还是 JRE 我在几个网站上看到过 它设置为 JRE 而在其他情况下则设置为 JDK 它是否以任何方式依赖于 Java 版本 JDK代表Java开发工具包 而JRE代表Java运行时环境 JAVA
  • MySQL GROUP BY 行为

    给出下表 foo ID First Name Last Name 67 John Smith 67 Bill Jacobs What first name and last name下面的查询会返回 为什么 SELECT FROM foo
  • HTML 和 CSS:悬停时显示 div [重复]

    这个问题在这里已经有答案了 我试图得到它 以便当有人将鼠标悬停在 div 框上时 它会在其下方显示一个单独的 div 框 我该怎么做呢 HTML div div h1 Home h1 div div div div
  • Firebase UI Recyclerview OnClick 不起作用,尝试了一切。这不是一个重复的问题

    我正在尝试在我的 Android 应用程序中添加 Firebase Recyclerview 当我添加时 所有数据都正常从 Firestore 获取 但是当涉及到处理 onClick 事件时 它根本不起作用 我遵循的事情 添加了带有方法的接
  • 在画布上绘制位图已缩放

    我创建了一个带有两个位图的自定义视图 当我在视图之外的 ImageView 中使用位图时 图像正常 我得打电话setDensity 240 hdpi 设备 但没关系 但是 在自定义视图中 当我在画布上绘制相同的位图时 onDraw Canv
  • C:\ProgramData\Oracle\Java\javapath\java.exe 使用哪个 JRE?

    我试图找出 java 使用哪个环境变量来查找 检测所使用的 JREC ProgramData Oracle Java javapath java exe 根据 Oracle 的设计 我在C ProgramData Oracle Java j
  • Java-8中Stream的循环融合(内部如何工作)

    我正在读 Java in Action 一书 而且我在书中看到了Stream的示例代码 List