我想对列表的第一个元素执行某些操作,并对所有剩余元素执行不同的操作。
这是我的代码段:
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 :(得分:5)
这会更清洁吗
items.stream().limit(1).forEach(v -> System.out.println("first: "+ v));
items.stream().skip(1).forEach(System.out::println);
答案 1 :(得分:5)
表达意图的一种方式是
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
s,并且在链接更高级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);