有没有办法使用 Java Streams 从字符串 ArrayList 中过滤符合条件的子字符串?

Sha*_*mar 2 java java-stream

有没有办法使用 Java Streams 来实现这一点?

List<String> list = new ArrayList<>();
list.add("x=aa,y=bb,y=cc");
list.add("y=dd,z=ee,w=ff");
list.add("w=gg,w=hh,w=ii");
Run Code Online (Sandbox Code Playgroud)

我想过滤上面的 ArrayList 以仅包含类型为“y”的字符串值。像下面这样

list=["bb","cc","dd"]
Run Code Online (Sandbox Code Playgroud)

我可以使用 String.split(",") 使用多行代码并将符合条件的子字符串插入到新的 ArrayList 中来实现此目的。但是有没有一种干净的方法可以使用 Java Streams 来实现这一点呢?

Bas*_*que 5

你问:

\n
\n

有没有一种干净的方法可以使用 Java Streams 来实现这一点?

\n
\n

是的。事实上,您可以处理您的输入,过滤掉不需要的部分,并生成一个完成的列表,所有这些都使用流。

\n

首先定义一些示例数据,即输入列表

\n

从该列表生成一个。根据我们的示例数据,该流有 3 个元素。

\n

调用Stream#flatMap以返回一个新流,其元素由原始流\xe2\x80\x99s 元素的片段组成。新流有 9 个元素,是通过将 3 个原始元素中的每一个分解为 3 个部分而生成的 (3 * 3 = 9)。

\n

过滤较新的较长流,以查找文本以我们的目标y=前缀开头的元素。

\n

转换通过我们的 filter\xe2\x80\x99s谓词测试的每个字符串元素。使用简单的字符串操作将“y=”替换为空字符串。因此,诸如 之类的值就y=bb变成了bb

\n

通过聚集成一个新List对象来收集转换后的字符串。

\n
List < String > inputs =\n        List.of(\n                "x=aa,y=bb,y=cc" ,\n                "y=dd,z=ee,w=ff" ,\n                "w=gg,w=hh,w=ii"\n        );\nList < String > results =\n        inputs\n                .stream()                                                 // Generate stream whose elements are each of the list\xe2\x80\x99s elements.\n                .flatMap( input -> Arrays.stream( input.split( "," ) ) )  // Break each element into parts, feeding each part into a new longer stream.\n                .filter( pairing -> pairing.startsWith( "y=" ) )          // Filter out any strings not beginning with `y=`. \n                .map( pairing -> pairing.replace( "y=" , "" ) )           // A value such as `y=bb` becomes `bb`.\n                .toList();                                                // Collect transformed strings into a new list.\n
Run Code Online (Sandbox Code Playgroud)\n

运行时。

\n
\n

结果.toString() = [bb, cc, dd]

\n
\n

.sorted()要将结果按排序顺序排列,请在 之前添加对 的调用toList()

\n