【问题标题】:Extracting Part of Stream of Strings to Method将部分字符串流提取到方法
【发布时间】:2021-11-26 15:08:50
【问题描述】:

总的来说,我对流和编写代码还是很陌生。

我有这两种方法:

方法一:

private String firstMethod (String fieldAlias, String someName) {

    return Stream.of(
                    fieldAlias + ".field1",
                    fieldAlias + ".field2",
                    fieldAlias + ".field3",
                    someName + ".NAME"
            ).collect(Collectors.joining(" AND ", "(", ")"));
}

方法二:

private String secondMethod (String fieldAlias, String someValue) {

    return Stream.of(
                    fieldAlias + ".field1",
                    fieldAlias + ".field2",
                    fieldAlias + ".field3",
                    someName + ".VALUE"
            ).collect(Collectors.joining(" AND ", "(", ")"));
}

这是我要提取的部分,可以从流中调用的单独方法(以避免重复代码):

fieldAlias + ".field1",
fieldAlias + ".field2",
fieldAlias + ".field3"

我尝试创建一个方法来返回三个字符串的列表,并以某种方式在两个方法的流中从列表中流式传输字符串。返回列表没有问题,但我只是不知道如何将该列表中的字符串合并到现有流中。任何帮助将不胜感激!

【问题讨论】:

  • 我不太确定您的要求是什么,但您的示例对于流来说似乎是多余的,或者至少可以通过完全传递第 4 个元素来统一它(或者如果有必要传入 @987654324 @ 和prefix,例如“.NAME”或“.VALUE”)。如果这只是一个简化的示例,您可能需要详细说明。如果您真的需要使用流,请尝试返回包含前 3 个元素的流,然后使用 Stream.concat(first3, Stream.of(4th)).collect(....)
  • 这个例子相当简单。我正在处理已经存在的代码,因此希望继续使用流,并将两个流中相同的部分外包给另一种方法。我认为该方法返回一个可以在流中使用的字符串列表是最简单的。我不确定我是否在解释方面做得很好,但我会尝试使用您的建议,谢谢!
  • @Thomas:使用 Stream.concat 效果很好!谢谢!
  • 第二种方法更改了参数名称,但没有更改对它的引用,这会破坏代码。抛开这种不必要的参数重命名,唯一真正的区别是".NAME" 已更改为".VALUE"。如果这确实是预期的唯一区别,请创建一个将该字符串作为参数的方法,从而重用 99% 的代码,而不仅仅是该内部部分。

标签: java list arraylist java-stream


【解决方案1】:

看来".NAME"".VALUE"后缀可以在someName参数内传递。

另外,.fieldsX 组件可以被提取到一个单独的列表中,然后方法可以重构为:

private static final List<String> FIELDS = Arrays.asList(".field1", ".field2", ".field3");
private static String aliasAndParam (String fieldAlias, String param) {
    return Stream.concat(
        FIELDS.stream().map(f -> fieldAlias + f),
        Stream.of(param)
    )
    .collect(Collectors.joining(" AND ", "(", ")"));
}

测试:

System.out.println(aliasAndParam("newField", "param.NAME")); // firstMethod
System.out.println(aliasAndParam("otherField", "p2.VALUE")); // secondMethod

输出:

(newField.field1 AND newField.field2 AND newField.field3 AND param.NAME)
(otherField.field1 AND otherField.field2 AND otherField.field3 AND p2.VALUE)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-21
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    相关资源
    最近更新 更多