任务是仅使用cactoos库获取文件中除以#开头的行之外的所有行。我得到了以下解决方案:
Iterable<Text> data =
new Filtered(
(Func<Text, Boolean>) text -> !text.asString().startsWith("#"),
new Split(
new TextOf(file),
new TextOf("\\n")
)
);在这个解决方案中,我不喜欢过滤函数,在这个函数中,我直接使用startsWith方法。在cactoos中,我没有找到一个检查字符串是否以字符开头的对象。startsWith调用违反了优雅对象的原则,即一切都应该是对象。
我看到的解决方案之一是编写一个对象,如下所示
import org.cactoos.Scalar;
import org.cactoos.Text;
import org.cactoos.text.TextOf;
public final class StartsWith implements Scalar<Boolean> {
private final Text origin;
private final Text prefix;
public StartsWith(String origin, String prefix) {
this(new TextOf(origin), new TextOf(prefix));
}
public StartsWith(Text origin, Text prefix) {
this.origin = origin;
this.prefix = prefix;
}
@Override
public Boolean value() throws Exception {
return origin.asString().startsWith(prefix.asString());
}
}只使用cactoos库类就可以做到这一点吗?
您更喜欢哪种解决方案?
发布于 2020-07-13 06:10:57
虽然StartsWith是Scalar<Boolean>,但它已经存在于cactoos中。
new Filtered<>(
new Split(
new TextOf(file),
new TextOf("[\r\n]+")
),
x -> new Not(new StartsWith(x, new TextOf("#")))
)https://stackoverflow.com/questions/59328477
复制相似问题