【发布时间】:2015-08-29 20:15:03
【问题描述】:
我正试图改变我的想法以思考功能性方式,最近遇到了一种情况,我需要从列表中挑选元素直到满足条件,但我找不到一种简单自然的方式来实现这一点。显然我还在学习。
假设我有这个清单:
List<String> tokens = Arrays.asList("pick me", "Pick me", "pick Me",
"PICK ME", "pick me and STOP", "pick me", "pick me and Stop", "pick me");
// In a non lambdas was you would do it like below
List<String> myTokens = new ArrayList<>();
for (String token : tokens) {
myTokens.add(token);
if (token.toUpperCase().endsWith("STOP")) {
break;
}
}
提前感谢您的意见
注意: 在发布此之前,我阅读了Limit a stream by a predicate,但我看不出如何使该答案适应我的问题。任何帮助将不胜感激。
【问题讨论】:
-
我在发表我的问题之前已经阅读过这个问题,但我认为并且仍然认为 java 会开箱即用地实现这一目标。说类似
myTokens = tokens.stream().collect(toListWhile(...))或实现toListWhile()自定义收集器的简单方法 -
我认为 Streams API 中没有一个操作会假设一个有序的流,而对于一个无序的流则失败。这就是你想象中的操作。
-
@AnidMonsur,这不是完全重复的,因为这里 OP 也想采用 STOP 元素。这是一个有点不同的问题。
-
@MarkoTopolnik,
takeWhile实际上是这样的。无序流的JavaDoc statement 特别棒!任何子集,原文如此!在我看来,如果它抛出异常实际上会更好...... -
@tagir 啊,所以他们把它加回来了——如果这些是在 Java 8 发布之前计划好的,但后来又放弃了。与 GIGO 相比,Java 通常具有快速失败的语义。这肯定会产生很多傻眼的 SO 问题。
标签: java lambda java-8 java-stream