我一直在尝试将更多的函数式编程融入到我所做的事情中,因为我编写的代码具有无副作用的性质,并且在并发代码中具有实用性。我遇到了需要过滤掉java流的连续元素的情况,并且没有比简单的旧命令方法更好的函数方法了。假设我有一个记录参数的程序,我想过滤掉两个连续的元素。例如,-o anOption,-k aSecKeyWhoseValueWeShouldNotLog,-a antherOption
。我在日志中想要的是-o anOption,-a antherOption
。
我提出了几种方法,但没有一种方法比使用for循环更容易理解,该循环索引了我需要过滤掉的内容。
这似乎是一件很平常的事情。是否有一种模式,使用java流或其他任何东西,通常用于这类事情?
谢谢
这是我最后得到的。
static String filterSecretKeyOutOfCommandLineLogString(final String[] args) {
return joinArgsToString(filterOptionAndValueOutOfCommandLineLogString(SECRET_KEY, args));
}
private static String joinArgsToString(final String[] args) {
return Joiner.on(ARG_JOINER_DELIMITER).join(args);
}
private static String[] filterOptionAndValueOutOfCommandLineLogString(final Option option, final String[] args) {
final List<String> filteredList = new ArrayList<>();
final int numArgs = args.length;
for (int i = 0; i < numArgs; ++i) {
if (Arguments.matchesOption(option, args[i])) {
++i;
} else {
filteredList.add(args[i]);
}
}
return filteredList.toArray(new String[0]);
}
我不确定这是否比你现有的更好。假设输入是一个String[]
,而您想要的(中间)输出也是一个String[]
,则可以简单地将其转换为Java流
static String[] filterOptionAndValue(String option, String args[]) {
return IntStream.range(0, args.length)
.filter(i -> i % 2 == 0)
.mapToObj(i -> new AbstractMap.SimpleEntry<>(args[i], args[i + 1]))
.filter(e -> !option.equals(e.getKey()))
.flatMap(e -> Stream.of(e.getKey(), e.getValue()))
.toArray(String[]::new);
}
public static void main(String... env) {
String[] args = {"-o", "opt1", "-k", "secret", "-a", "opt2"};
System.out.println(Arrays.toString(filterOptionAndValue("-k", args)));
}
[-o, opt1,-a, opt2]
如何跳过中的数组元素? 我的代码: 这将返回:
问题内容: 可以在连续流上使用吗? 我的意思是说是一条命令,但在输出中仅保留我感兴趣的行。 我已经尝试过了,但是似乎只能在完成后才能执行,也就是说永远不会执行。 问题答案: 使用BSD grep(FreeBSD,Mac OS X等)时,打开的行缓冲模式。 您无需为GNU grep(几乎在任何Linux上使用)执行此操作,因为它会默认刷新(对于其他类似Unix的版本,如SmartOS,AIX或QNX
问题内容: 例如我有以下代码 并引发异常 我不在乎是否未读取某些行,但是如何跳过无效字符并继续读取行? 问题答案: 您可以通过调用来影响字符集解码处理无效输入的方式。 通常, 您永远不会直接看到对象,因为它将在后台为您创建。因此,如果需要访问它,则需要使用API,该API允许您直接指定(而不是仅编码名称或)。 此类API的最基本示例是: 请注意,此代码使用了Java 7类,对于早期版本,你可以
如果我有一个<代码>流 最明显的解决方案是使用<code>limit(originalLength-elementsToRemoveAtEnd),但这需要事先知道初始长度,这并不总是如此。 有没有一种方法可以删除长度未知的流的最后几个元素,而无需将其收集到中,计算元素并再次流式传输?
我开始学习Java流,我想知道是否有可能只偷看流的第一个元素而不检索它。 例如,我有多个流,每个流都有按非降序排序的整数,我想得到所有整数的排序列表,所以我考虑使用< code>PrioirtyQueue 但是,为了获取
问题内容: 鉴于流,例如, 如何最优雅地将其转换为给定形式: (当然,假设我已经定义了Pair类)? 编辑:这不严格有关整数或原始流。对于任何类型的流,答案应该是通用的。 问题答案: 我的StreamEx库扩展了标准流,它pairMap为所有流类型提供了一种方法。对于原始流,它不会更改流类型,但可用于进行一些计算。最常见的用法是计算差异: 对于对象流,你可以创建任何其他对象类型。我的库没有提供任何