我有一个包含表的行的Stream.第一行包含标题行,应该以不同的方式处理.然后,应以标准方式处理其余行.

我不想跳过标题行,因为我需要该行的信息.天真的解决方案应该是这样的:

Stream<Row> rows = ...;
Row headRow = rows.<what comes here?>;
rows.forEach( this::processRow );

但这显然是不可能的.我能想到的最接近的就是:

Stream<Rows> rows = ...;
AtomicReference<Row> headRow = new AtomicReference<>();
rows.takeWhile(r -> { 
    if (headRow().get()==null) { 
        headRow.set(r); 
        return true;
    }
    return false; 
})
.forEach( this::processRow );

这应该行得通,但IMHO有点尴尬.

有人知道如何更好地解决这个问题吗?(它应该可以在Java 17上运行,而不需要像guava这样的附加库.)

注意:首先使用Collect()创建列表,处理标题行,然后转换回流并跳过第一个元素,但我认为这不是一个好的解决方案,因为它需要更多的内存(因为所有元素都必须同时保存在内存中).

推荐答案

spliterator美元怎么样?

Stream<Integer> rows = Stream.of(1, 2, 3);
var spliterator = rows.spliterator();
spliterator.tryAdvance(x -> System.out.println("Header " + x));
spliterator.forEachRemaining(x -> System.out.println("Data " + x));

或者,我会考虑以下助手函数:来自芭乐的Stream<T> stream(Iterator<T> iterator).它只依赖于JDK类.

/**
 * Returns a sequential {@link Stream} of the remaining contents of {@code iterator}. Do not use
 * {@code iterator} directly after passing it to this method.
 */
public static <T extends @Nullable Object> Stream<T> stream(Iterator<T> iterator) {
  return StreamSupport.stream(Spliterators.spliteratorUnknownSize(iterator, 0), false);
}

然后:

Stream<Integer> rows = Stream.of(1, 2, 3);
var it = rows.iterator();
var headOpt = it.hasNext() ? Optional.of(it.next()) : Optional.empty();
var tail = stream(it);
System.out.println(headOpt);
tail.forEach(System.out::println);

Java相关问答推荐

收听RDX中用户数据的变化

Android视图覆盖不阻止点击它后面的控件

Java事件系统通用转换为有界通配符

为什么Java中的两个日期有差异?

使用Java Streams API比较两个不同的Java集合对象和一个公共属性

有没有一种方法使保持活动设置专用于java.net.http.HttpClient的一个实例

如何在带有Micronaut的YAML中使用包含特殊字符的字符串作为键

DTO到实体,反之亦然,控制器和服务之间的哪一层应该处理转换?

如何使用Maven和Spring Boot将构建时初始化、跟踪类初始化正确传递到本机编译

将关键字与正文中的_Allowed匹配,但带有__Signing可选后缀

使用Mockito进行的Junit测试失败

如何在ApachePOI中将图像添加到工作表的页眉?

如何使用值中包含与号的查询参数创建一个java.net.URI

如何从HttpResponse实例获取Entity对象的内容?

OAuth:登录后无法查看Google邮箱地址

如何利用OpenTelemeter将初始值(零)输出到普罗米修斯

保持标题窗格的箭头可见,即使设置为不可折叠

如何使用外部函数从Java中获取C++ struct 的返回值&;内存API

java21预览未命名的符号用于try-with-resources

ResponseEntity.控制器截断响应的JSON部分