当前位置: 首页 > 知识库问答 >
问题:

在foreach之前/之后使用流式api执行操作

鞠自明
2023-03-14

下面是我想在可能的情况下仅使用流式API复制的非流代码:

List<String> list = Arrays.asList("one", "two", "three", "four");
list.removeIf(s -> s.length() <= 3);

if (!list.isEmpty()) {
    System.out.println("before");
    for (String elem : list) {
        System.out.println(elem);
    }
    System.out.println("after");
}

当然,对于流来说,简单的迭代很容易:

List<String> list = Arrays.asList("one", "two", "three", "four");
list.stream()
        .filter(s -> s.length() > 3)
        .forEach(System.out::println);

但我需要添加“before”和“after”行,前提是过滤后流不是空的。这可能在一个语句中实现,还是我需要收集?

这似乎不是一个更好的解决方案。。。

List<String> list = Arrays.asList("one", "two", "three", "four");
List<String> filtered = list.stream()
        .filter(s -> s.length() > 3)
        .collect(Collectors.toList());
if (!filtered.isEmpty()) {
    System.out.println("before");
    filtered.stream().forEach(System.out::println);
    System.out.println("after");
}

共有1个答案

闾丘德业
2023-03-14

您可以使用anyMatch()收集器。使用前缀和后缀连接()

private static String NEW_LINE = System.lineSeparator();

public static void print(List<String> list) {
    String str = list.stream().anyMatch(s -> s.length() > 3) 
        ? list.stream().filter(s -> s.length() > 3)
                .collect(Collectors.joining(NEW_LINE, 
                        "before" + NEW_LINE, NEW_LINE + "after"))
        : "";
    System.out.println(str);
}

测试

List<String> list = Arrays.asList("one", "two", "three", "four");

print(list);

输出:

before
three
four
after
 类似资料:
  • 在我的程序中,我反复1收集Java8流,以将对象集合减少为单个对象。在整个执行过程中,这个集合的大小可能会有很大的变化:从3个对象到数百个对象。 在优化我的代码和搜索瓶颈的过程中,我在某个点使流并行。这在当时起了作用,因为所有的收藏都相当大。后来,在更改程序的其他部分和参数后,集合变小了。我意识到不让流平行更有效。这是有道理的:为4个对象在多个线程上分配工作的开销根本不值得。不过,对于成百上千的物

  • 如果你希望在每次运行 Puppet 之前执行命令,可以在配置文件中使用 prerun_command 配置。 类似地,你也可以使用 postrun_command 配置运行 Puppet 之后需要执行的命令。 这种机制为 Puppet 与其他软件的集成提供了强大的钩子,甚至可以触发其他机器上的事件。 prerun 和 postrun 命令必须能成功运行(即其返回的状态码为 0),否则 Puppet

  • 我有一个执行一些网络操作的自定义视图。视图根据该操作结果构建UI。 该视图包含通过Internet获取的卡的列表。此视图用于多个地方。假设其中一个是我的碎片。 下面是我在Fragment中的操作: 我的自定义视图如下所示: 好了,现在当用户从我的应用程序切换到另一个应用程序时,我的碎片可能会被销毁。我想保存我的自定义视图的状态。因此,我的观点不需要再从互联网上获取信息。因此,我在中附加了以下数据(

  • 问题内容: 我从市场上的应用程序中获取用户报告,但出现以下异常: 显然,它与FragmentManager有关,我不使用。stacktrace不显示我自己的任何类,因此我不知道发生此异常的位置以及如何防止它。 作为记录:我有一个tabhost,在每个选项卡中都有一个ActivityGroup在Activity之间切换。 问题答案: 基本上我只需要: 不要在方法上进行调用。这太糟了… 这是支持包中的

  • 问题内容: 有一种简单的方法可以在调用之前和之后调用JavaScript动作,例如,我想在后备bean中调用 之前 和 之后 调用JavaScript动作: 添加多个元素似乎不起作用(也许应该吗?!),例如 仅被调用。 问题答案: 使用属性。它必须指向一个回调函数引用(所以不要包括括号!): 实际的回调函数如下所示(JSF会自己提供参数):

  • null java.lang.IllegalStateException:在onSaveInstanceState e/androidRuntime(9008):at android.support.v4.app.fragmentManagerImpl.checkStateLoss(fragmentManager.java:1354)e/androidRuntime(9008):at androi