【问题标题】:Lambda function in Java skips elementsJava中的Lambda函数跳过元素
【发布时间】:2015-10-07 15:05:06
【问题描述】:

我有一行需要解析,如下所示:

@UNIT,a,b,c,,,,d,e,,,

我希望 Java 将以下值存储在一个列表中:

[0] => a
[1] => b
[2] => c
[3] => null
[4] => null
[5] => null
[6] => d
[7] => e
[8] => null
[9] => null
[10] => null

我想用逗号分隔值并将空值替换为null

我用以下代码归档了大部分部分:

metaObject.unit = Arrays.stream(line
        .split(","))
        .skip(line.startsWith("@UNIT,") ? 1 : 0)
        .map(String::trim)
        .map(s -> " ".equals(s) || "".equals(s) || "_".equals(s)? null : s)
        .collect(Collectors.toList());

其中metaObject.unit 定义为List<String> unit = new ArrayList<String>();

问题在于 Java 忽略了最后一个非空元素之后出现的空元素。我在给定情况下得到的输出是:

[0] => a
[1] => b
[2] => c
[3] => null
[4] => null
[5] => null
[6] => d
[7] => e

我不明白为什么 Java 不像以前那样威胁空元素。有什么技巧可以解决这个问题吗?

【问题讨论】:

    标签: java lambda java-8 java-stream


    【解决方案1】:

    问题其实来自line.split(",")

    默认引用split(regex)的Javadoc:

    因此,结果数组中不包含尾随的空字符串。

    所以这个调用的结果是[@UNIT, a, b, c, , , , d, e]

    您想要包含尾随的空字符串,因此您需要调用line.split(",", -1)(注意第二个负参数)。引用split(regex, limit)的Javadoc,关于limit参数:

    如果 n 为非正数,则该模式将被应用尽可能多的次数,并且数组可以具有任意长度。

    更正的代码:

    metaObject.unit = Arrays.stream(line
        .split(",", -1))
        .skip(line.startsWith("@UNIT,") ? 1 : 0)
        .map(String::trim)
        .map(s -> s.isEmpty() || "_".equals(s) ? null : s)
        .collect(Collectors.toList());
    

    (请注意,我删除了对" ".equals(s) 的调用,因为如果是这种情况,之前对trim 的调用会使该字符串成为空字符串,并且正如霍尔格在他的评论中指出的那样,我替换了@ 987654332@ 和清洁工s.isEmpty())。

    【讨论】:

    • 然后你可以用s.isEmpty()替换"".equals(s),这更干净,恕我直言。
    • @Holger,对我来说,更简洁的方法是创建一个单独的方法,如boolean isEmptyEntry(String s) { return s.isEmpty() || s.equals(" ") || s.equals("_"); },这样它就可以单独支持、测试和重用。顺便说一句,在当前代码 s.equals(" ") 中永远不会像 trim 之后发生的那样正确。
    • @Drudge,如果您的 IDE 具有自动完成功能,则无论何时您键入 .spl␣,第二个参数都应显示在建议的结果中。实际上学习文档是成功的一半;)
    • @Tagir Valeev:已经在答案中解决了字符串永远不能是" "。我不确定s.isEmpty() || s.equals("_") 是否超过阈值,值得单独使用可测试的方法。顺便说一句,您也可以写s.matches("_?") 来一次调用测试所有内容,但是,这可能需要承担一些开销……
    猜你喜欢
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 2021-03-28
    • 2017-08-03
    • 2021-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多