Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Java8流减少字符串列表,仅将前缀添加到最后一个元素_Java_Lambda_Java Stream_Reduce_Combiners - Fatal编程技术网

使用Java8流减少字符串列表,仅将前缀添加到最后一个元素

使用Java8流减少字符串列表,仅将前缀添加到最后一个元素,java,lambda,java-stream,reduce,combiners,Java,Lambda,Java Stream,Reduce,Combiners,如何使用Java 8 Streams减少或收集由逗号分隔且前缀为“and”的字符串列表,直到最后一个元素 例如 List ls=Arrays.asList(“汤姆”、“特里”、“约翰”、“凯文”、“史蒂夫”); 字符串结果=ls.stream().map(字符串::toString) .collect(收集器。连接(“,”); 系统输出打印项次(结果); 此语句打印=>汤姆、特里、约翰、凯文、史蒂夫。但我想把名单打印成汤姆、特里、约翰、凯文和史蒂夫。流并不能让这更容易。您不妨使用String:

如何使用Java 8 Streams减少或收集由逗号分隔且前缀为“and”的字符串列表,直到最后一个元素

例如

List ls=Arrays.asList(“汤姆”、“特里”、“约翰”、“凯文”、“史蒂夫”);
字符串结果=ls.stream().map(字符串::toString)
.collect(收集器。连接(“,”);
系统输出打印项次(结果);

此语句打印=>汤姆、特里、约翰、凯文、史蒂夫。但我想把名单打印成汤姆、特里、约翰、凯文和史蒂夫。

流并不能让这更容易。您不妨使用
String::replaceAll

String input = "tom, terry, john, kevin, steve";
String result = input.replaceAll(", (\\w+)$", " and $1");

System.out.println(result);
输出:

tom, terry, john, kevin and steve

溪流并不能让这变得更容易。您不妨使用
String::replaceAll

String input = "tom, terry, john, kevin, steve";
String result = input.replaceAll(", (\\w+)$", " and $1");

System.out.println(result);
输出:

tom, terry, john, kevin and steve
两种解决方案

笨手笨脚的,实际上正在使用子列表:

使用类移动一个位置:

注意:类定义应该放在方法内部,如上所述。否则将需要
static
(a,s)
的lambda可以是SbS中的一种方法。对并行性的支持留给读者作为练习
(a1,a1)

两种解决方案

笨手笨脚的,实际上正在使用子列表:

使用类移动一个位置:


注意:类定义应该放在方法内部,如上所述。否则将需要
static
(a,s)
的lambda可以是SbS中的一种方法。对并行性的支持留给读者练习
(a1,a1)

流API没有提供实现这一点的标准方法。我的扩展标准流API的库中有一个方法在这里很有用。它只允许映射最后一个流元素,其他元素保持原样:

System.out.println(StreamEx.of(ls).mapLast("and "::concat).joining(", "));
结果如下:

tom, terry, john, kevin, and steve
请注意,它在“and”之前添加了一个逗号,这是可以的(请参阅)。如果您不喜欢它(或者实际上使用了另一种禁止使用这种标点符号的语言),那么可以通过稍微长一点的方式实现:

StreamEx.of(ls)
        .mapLastOrElse(", "::concat, " and "::concat)
        .joining().substring(", ".length());

流API没有提供实现这一点的标准方法。我的扩展标准流API的库中有一个方法在这里很有用。它只允许映射最后一个流元素,其他元素保持原样:

System.out.println(StreamEx.of(ls).mapLast("and "::concat).joining(", "));
结果如下:

tom, terry, john, kevin, and steve
请注意,它在“and”之前添加了一个逗号,这是可以的(请参阅)。如果您不喜欢它(或者实际上使用了另一种禁止使用这种标点符号的语言),那么可以通过稍微长一点的方式实现:

StreamEx.of(ls)
        .mapLastOrElse(", "::concat, " and "::concat)
        .joining().substring(", ".length());

您需要新建一行,并使用4个空格作为缩进来突出显示代码。这将使它更容易阅读!您需要新建一行,并使用4个空格作为缩进来突出显示代码。这将使它更容易阅读!我认为不需要
map()
,它在每个字符串上调用
toString
。说到这里,我认为即使是流也不需要,因为在这种情况下,它只是一种更详细的@Vld方法,你是对的。但我怀疑OP的输入不是字符串,而是其他对象,这是最接近实际情况的示例。我基本上忽略了我的行的输入是如何创建的。我会更进一步:
ls.toString().replaceAll(“^.|.$”,”).replaceAll(“,(\\w+$”,“和$1”)
,并绕过整个流火车残骸。我认为不需要
map()
,它在每个字符串上调用
toString
。说到这里,我认为即使是流也不需要,因为在这种情况下,它只是一种更详细的@Vld方法,你是对的。但我怀疑OP的输入不是字符串,而是其他对象,这是最接近实际情况的示例。我基本上忽略了我的行的输入是如何创建的。我会更进一步:
ls.toString().replaceAll(“^.|.$”,“).replaceAll(“,(\\w+$”,“和$1”)
,并绕过整个流火车。牛津逗号的问题是,当正好有两个元素时,它不应该出现…@Holger,这绝对是个问题。向我的库中添加一个特殊的收集器来解决所有这些情况将过于具体,因为其他语言可能有不同的标点符号规则。如果ICU4J这样的项目是面向Java 8的,它可能会提供这样的收集器……那么,将数据结构格式化为特定的人类语言并不是一项必须有现成解决方案(也不必是基于流的)的任务。就UI而言,最先进的技术仍然是有一个带有预构建模板字符串的资源包……牛津逗号的问题是,当正好有两个元素时,它不应该出现…@Holger,这肯定是个问题。向我的库中添加一个特殊的收集器来解决所有这些情况将过于具体,因为其他语言可能有不同的标点符号规则。如果ICU4J这样的项目是面向Java 8的,它可能会提供这样的收集器……那么,将数据结构格式化为特定的人类语言并不是一项必须有现成解决方案(也不必是基于流的)的任务。在UI的情况下,最先进的技术仍然是有一个带有预构建模板字符串的资源包…