当前位置: 首页 > 面试题库 >

Java 8流条件处理

海信鸥
2023-03-14
问题内容

我有兴趣将流分成两个或多个子流,并以不同的方式处理元素。例如,(大)文本文件可能包含A类型的行和B类型的行,在这种情况下,我想执行以下操作:

File.lines(path)
.filter(line -> isTypeA(line))
.forEachTrue(line -> processTypeA(line))
.forEachFalse(line -> processTypeB(line))

上一个是我试图抽象这种情况。实际上,我有一个非常大的文本文件,其中的每一行都针对正则表达式进行测试;如果该行通过,则将对其进行处理,而如果被拒绝,则我想更新一个计数器。对拒绝的字符串进行的进一步处理是为什么我不简单使用的原因filter

是否有任何合理的方法可以对流执行此操作,还是必须回退到循环?(我也希望它可以并行运行,所以流是我的首选)。


问题答案:

Java
8流并非旨在支持这种操作。从jdk:

流只能操作一次(调用中间流或终端流操作)。例如,这排除了“分叉”流,其中相同的源提供了两个或多个管道,或同一流的多次遍历。

如果可以将其存储在内存中,则Collectors.partitioningBy只有两种类型时可以使用,并使用Map<Boolean, List>。否则使用Collectors.groupingBy



 类似资料:
  • 以下代码正在为空的属性抛出NPE。class Person有属性:string:name,Integer:age,Integer:salary此处可以为空。我想创建一个工资列表。 在这里,我必须在结果列表中保留空值。null不能替换为0。

  • 我正在尝试根据买入或卖出方向对股票订单列表进行排序。 我试过这样的方法: 我看到下面的错误消息,我不清楚。 不兼容的类型。必需的int,但已将“comparing”推断给Comparator:不存在类型变量T,U的实例,因此Comparator符合Integer。

  • 有时您希望筛选具有多个条件的: 也可以使用复杂条件和单个: 第一种方法在可读性方面胜出,但在性能方面,什么更好呢?

  • 我试图翻译这个(简化)代码使用Java-8流: 以下是我尝试过的: 但以上给出了所有

  • 正如这篇stackoverflow文章中所述,在调用终端操作之前,不会实际应用筛选器。既然我在调用终端操作之前重新分配了stream的值,那么上面的代码是否仍然是使用Java8流的适当方法呢?

  • 在Java8的Streams中,我知道如何基于谓词过滤集合,并处理谓词为true的项。我想知道的是,如果谓词仅将集合划分为两个组,那么是否可以通过API基于谓词进行过滤,处理过滤结果,然后立即连接调用以处理过滤器排除的所有元素? 例如,考虑以下列表: 是否有可能做到: 或者我只需对过滤的项目执行过程,然后调用原始列表上的和,然后处理剩余的项目? 谢谢