使用Java8流对列表的第一个元素执行特定操作

使用Java8流对列表的第一个元素执行特定操作,java,java-stream,Java,Java Stream,我想对列表的第一个元素执行某些操作,对所有剩余元素执行不同的操作 以下是我的代码片段: List<String> tokens = getDummyList(); if (!tokens.isEmpty()) { System.out.println("this is first token:" + tokens.get(0)); } tokens.stream().skip(1).forEach(token -> { System.out.println(to

我想对列表的第一个元素执行某些操作,对所有剩余元素执行不同的操作

以下是我的代码片段:

List<String> tokens = getDummyList();
if (!tokens.isEmpty()) {
    System.out.println("this is first token:" + tokens.get(0));
}
tokens.stream().skip(1).forEach(token -> {
    System.out.println(token);
});
List tokens=getDummyList();
如果(!tokens.isEmpty()){
System.out.println(“这是第一个令牌:+tokens.get(0));
}
tokens.stream().skip(1).forEach(token->{
System.out.println(令牌);
});
有没有更干净的方法来实现这一点,最好使用Java8流式API。

这样会更干净吗

    items.stream().limit(1).forEach(v -> System.out.println("first: "+ v));
    items.stream().skip(1).forEach(System.out::println);

表达意图的一种方式是

Spliterator<String> sp = getDummyList().spliterator();
if(sp.tryAdvance(token -> System.out.println("this is first token: "+token))) {
    StreamSupport.stream(sp, false).forEach(System.out::println);
}
但是,与同等处理所有流元素相比,对第一个元素的特殊处理仍然可能导致性能损失

如果您只想应用像
forEach
这样的操作,还可以使用
迭代器

Iterator<String> tokens = getDummyList().iterator();
if(tokens.hasNext())
    System.out.println("this is first token:" + tokens.next());
tokens.forEachRemaining(System.out::println);
Iterator tokens=getDummyList().Iterator();
if(tokens.hasNext())
System.out.println(“这是第一个令牌:+tokens.next());
tokens.foreachreserving(System.out::println);

我认为您的方法已经简洁明了:)要防止NPE,我要做的一件事就是检查
标记是否为
null
是,这只是解释问题的伪代码。我想知道是否有某种方法可以合并流调用中的if条件并减少更多的行数。@vatsalmevada No.that或findFirst()尝试对同一个流进行操作会抛出
IllegalStateException:流已经被操作或关闭
迭代器应该是IMHO接受的解决方案+1.
Iterator<String> tokens = getDummyList().iterator();
if(tokens.hasNext())
    System.out.println("this is first token:" + tokens.next());
tokens.forEachRemaining(System.out::println);