2016-11-16 77 views
3

我想对列表的第一个元素执行某些操作,并对所有其余元素执行不同的操作。使用Java8流在列表的第一个元素上执行特定操作

这里是我的代码片段:

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); 
}); 

是否有更多实现这一目标最好采用java 8流API更清洁的方式。

+0

我认为你的做法已经干净简洁:) – TheLostMind

+1

有一件事我会做,以防止NPE也检查'tokens'是否为'null' – TheLostMind

+0

是的,这只是虚拟代码来解释问题。我想知道是否有一些方法可以合并,如果条件内的流式调用,并减少更多的行数。 –

回答

3

这会是清洁要表达的意图

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

that or findFirst() –

4

一种方法是

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); 
} 

与任意Collection S,不仅List的作品,并有可能比skip基础的解决方案时更有效更先进的Stream操作链接在一起。这种模式也适用于一个Stream源,即当多次遍历不可能或者可能产生不同结果时。

Spliterator<String> sp=getDummyList().stream().filter(s -> !s.isEmpty()).spliterator(); 
if(sp.tryAdvance(token -> System.out.println("this is first non-empty token: "+token))) { 
    StreamSupport.stream(sp, false).map(String::toUpperCase).forEach(System.out::println); 
} 

然而,第一个元素的特殊待遇仍可能会导致性能损失,相对于同样处理所有的流元素。

如果你想要做的就是将像forEach一个动作,你也可以使用一个Iterator

Iterator<String> tokens = getDummyList().iterator(); 
if(tokens.hasNext()) 
    System.out.println("this is first token:" + tokens.next()); 
tokens.forEachRemaining(System.out::println); 
+0

迭代器应该是可接受的解决方案恕我直言。 +1 – Eugene

相关问题